使用C语言进行面向对象的开发--GObject入门[6]
来源:互联网 发布:连锁超市软件 编辑:程序博客网 时间:2024/05/16 10:18
转自: blog.csdn.net/pingf0 或www.cnblogs.com/pingf
Part 6
接上文。
和官方的tutorial一样,在此部分,简要叙述下GObject中的方法。
其分为三类,
非虚公共方法
虚公共方法
虚私有方法
公共方法比较简单,所以也就没啥好说的了,看代码,其实就是明白着从外部调用
/* declaration in the header. */void jc_boy_do_action (JcBoy *self, /* parameters */);/* implementation in the source file */voidjc_boy_do_action (JcBoy *self, /* parameters */){ g_return_if_fail (JC_IS_BOY (self)); /* do stuff here. */}
虚公共方法则稍微绕了一圈
struct _JcBoyClass{ GObjectClass parent_class; /* stuff */ void (*do_action) (JcBoy *self, /* parameters */);};void jc_boy_do_action (JcBoy *self, /* parameters */);voidjc_boy_do_action (JcBoy *self, /* parameters */){ g_return_if_fail (JC_IS_BOY (self)); JC_BOY_GET_CLASS (self)->do_action (self, /* parameters */);}
可以看到是在类结构中用了个函式指针,当然这个指针肯定是要在类结构初始化时赋值的。当然最后还是留了个外部公共函式。
再具体看下
static voidjc_boy_real_do_action_two (JcBoy *self, /* parameters */){ /* Default implementation for the virtual method. */}static voidjc_boy_class_init (JcBoy *klass){ /* pure virtual method: mandates implementation in children. */ klass->do_action_one = NULL; /* merely virtual method. */ klass->do_action_two = jc_boy_real_do_action_two;}voidjc_boy_do_action_one (JcBoy *self, /* parameters */){ g_return_if_fail (JC_IS_BOY (self)); JC_BOY_GET_CLASS (self)->do_action_one (self, /* parameters */);}voidjc_boy_do_action_two (JcBoy *self, /* parameters */){ g_return_if_fail (JC_IS_BOY (self)); JC_BOY_GET_CLASS (self)->do_action_two (self, /* parameters */);}
注意看类结构klass->do_action_one = NULL,这就算是GObject中的纯虚函式了,呵呵,关键在我们的理解,毕竟C本身不是面向对象的,这还是模拟。
看到这里我们不禁会思考,既然虚公共方法都这样声明了,那么须私有方法又是什么样的呢?
答案比较恶搞,其实GObject中所谓的虚私有方法声明起来和虚公有方法是一样一样滴。唯一的不同就是不提供外部调用的函式【就是上面程序中的jc_boy_do_action_one和jc_boy_do_action_two】!这就决定了只能是类结构内部使用了,除了内部调用外,GObject的虚私有方法更多是用来使用在类的继承中,子类实现父类的纯虚方法。
下面举个例子,假设有个类JcMan继承自JcBoy,实现了JcBoy中的纯虚函式do_action_one
static voidjc_man_real_do_action_one (JcBoy *self, /* parameters */){ /* Default implementation for the virtual method. */}static voidjc_man_class_init (JcManClass *klass){ JcBoyClass *boy_class = JC_BOY_CLASS (klass); /* implement pure virtual class function. */ boy_class-> do_action_one = jc_man_real_do_action_one;}voidjc_man_do_action_one (JcMan *self, /* parameters */){ g_return_if_fail (JC_IS_MAN (self));JcBoy *boy = JC_BOY (self); JC_BOY_GET_CLASS (self)->do_action_one (boy /* parameters */);}
0 0
- 使用C语言进行面向对象的开发--GObject入门[6]
- 使用C语言进行面向对象的开发--GObject入门[1] [2]
- 使用C语言进行面向对象的开发--GObject入门[1]
- 使用C语言进行面向对象的开发--GObject入门[2]
- 使用C语言进行面向对象的开发--GObject入门[3]
- 使用C语言进行面向对象的开发--GObject入门[4]
- 使用C语言进行面向对象的开发--GObject入门[5]
- 使用C语言进行面向对象的开发--GObject入门[7]
- 使用C语言进行面向对象的开发--GObject入门[8]
- 使用C语言进行面向对象的开发--GObject入门[9]
- GObject参考手册(10)--GObject的对象属性
- GObject参考手册(2)--概念:GObject的开发背景
- 使用面向对象工具进行着面向过程的开发
- 用C语言进行面向对象编程
- 用C语言进行面向对象编程
- 用C语言进行面向对象编程
- C语言的面向对象
- 面向对象的c语言
- GO_BLOCK in WHEN_VALIDATE Trigger
- Technocup 2017 - Elimination Round 1
- Python继承中的元类
- ubuntu15.04怎么把英文界面设置成中文
- tweenjs大图滚动
- 使用C语言进行面向对象的开发--GObject入门[6]
- Linux中的文件描述符与打开文件之间的关系
- python中while循环的注意事项。
- 鼠标移入移出事件
- 基于opencv的单张图像去雾算法(一)
- android自定义ViewGroup之瀑布流FlowLayout 简洁明了 支持padding和margin 100行代码搞定
- テクニカルアーティストに必要な資料集めようぜ!
- 微信公众号开发——模板消息
- 交叉编译libxml2到ARM平台