转自: blog.csdn.net/pingf0 或www.cnblogs.com/pingf
Part 7
接上文
其实关于GObject中对象的构造,继承,方法的重载,在前面的几部份中都已经介绍。这一部分仅仅是为了补充些琐碎的知识,
而不会涉及信号啊,属性啊,接口啊。。。不拉不拉。。。
链上/溯回
官方的GObject tutorial中有这么一章节,叫chaining up,猛一看以为是“拴住”的意思,后来看了内容,不能当词组理解,姑且这样翻译了。
其实里面讲的东西就那么一点,就是怎么使用“链”【chaining】【也就是继承关系链】上游定义的东西。多用于方法的重载。
其实用的最多的就是实例类型的转换以及获取父类结构的这个函式了g_type_class_peek_parent
。
一个例子,假设b继承自a,要在a的某个方法之上重新实现这个方法。
static void b_method_to_call (B *obj, int a) { BClass *klass; AClass *parent_class; klass = B_GET_CLASS (obj); parent_class = g_type_class_peek_parent (klass); /* do stuff before chain up */ parent_class->method_to_call (obj, a); /* do stuff after chain up */ }
类的构造
其实前文已经说过了
调用时间
调用函式 |
批注 |
|
第一次调用某个对象 |
对象的base_init 函式 |
见过一些例子把信号和一些定义在这里,感觉一般用不到 |
对象的class_init 函式 |
这个不用说了吧 |
|
接口的base_init 函式 |
这个后文介绍 |
|
接口的interface_init 函式 |
见后文 |
|
对象实例化【每次 |
调用对象的“构造”函式GObjectClass->constructor |
按照tutorial所述,仅仅是根据属性改变某些状态时调用此函式。 比如如果某个属性为**时,print该属性的值。另外如果override此函式,必须先chaining up父类的“构造”函式。不过一般不用,官方的tutorial也有这么一句In doubt, do not override the constructor method.如果非要与一般类的构造函式对应,个人感觉如果非要对应的话,**_init和**_class_init更为合适。 |
对象实例化instance_init函式调用 |
这个前文说的够多了 |
类的析构
调用时间 |
调用函式 |
批注 |
最后一次对类别进行 |
类型的 dispose函式 |
前文说的很多了 |
类型的 finalize函式 |
见前文 |
|
最后一次对类别进行 并且这是该类别的最后一个实例 |
接口的interface_finalize 函式 |
“ 实际中很少使用,除非你特别需要”官方文档就是这么说滴。。。orz |
接口的base_finalize 函式 |
||
类型的 class_finalize 函式 |
||
类型的 base_finalize 函式 |
截止到此,关于GObject基本的使用都以介绍,后文中将会集中介绍信号,属性及接口,并在最后给出一个完整的带有接口,信号和属性的实例。
另外在此处给出一些链接,方便大家对比着学习。
1.http://www.ibm.com/developerworks/cn/linux/l-gobject/index.html
这是比较早期的一份资料,也是本人最初的参考。由乡村小学教师宋国伟先生编写。
文章条例比较清晰,富有完整的代码。但是实例命名方式不是很规范。而比较常用的接口也没有详细介绍。
为了保持统一,本人举例的类也用了类似的boy,man的定义。
2. http://imtx.cn/tag/manual/
ubuntu tweak ui的作者翻译的GObject manual,
还不错。但是更多是翻译,实例还是有些缺乏【因为mannual本身给的例子就不多,而且不够完整】
3. http://code.google.com/p/wallpaper-expert/w/list
这是google wallpaper上对gtk mail archive上关于gobject的一些翻译,排版很好,颜色丰富。
里面关于属性部分的介绍还是相当不错的,推荐下。
只是还是没有介绍接口,并且实例似乎不够完整【就是没有直接可以使用的例子】
4.还有就是官方的文档了,除了GObject的mannual,还可以看下gtk的manual,clutter的mannual,
里面都有使用GObject声明一个类的介绍。