使用C语言进行面向对象的开发--GObject入门[8]
来源:互联网 发布:金山打字通mac版官网 编辑:程序博客网 时间:2024/06/05 23:52
转自: blog.csdn.net/pingf0 或www.cnblogs.com/pingf
首先要更正一个前文中的“口误”,关于翻译的问题。
就是override和overload,大多数的翻译方法是重写和重载。但是有时我在叙述时都用重载了,
潜意识里认为重写这个词不是很顺。
本质上glib是不支持重载的,这里的不支持主要是在单一文件中不支持相同的函式名。
但是好在c语言可以把指针重定位。
PART 8
本部分介绍如何定义一个接口,个人感觉介绍GObject中如何使用接口的资料还是比较少的。。。。XD
一般的类的继承可以分为两种,一种就是传统的,另一种则是接口形式的。
在使用方面有些差异,前者调用一个类的成员,而后者则将某个类转换成抽象的接口,只使用接口中定义的方法。
在GObject中,按照个人的理解。所谓接口还是一个类结构,只不过这个类结构不被实例化,但其class结构还是要定义的。
假设我们定义一个名为Ihuman的接口,里面定义名为speak的方法。
#define JC_TYPE_IHUMAN (jc_ihuman_get_type ())#define JC_IHUMAN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JC_TYPE_IHUMAN, JcIhuman))#define JC_IS_IHUMAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JC_TYPE_IHUMAN))#define JC_IHUMAN_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), JC_TYPE_IHUMAN, JcIhumanInterface))
宏定义少了几个,因为不需要定义实例结构,这里面INTERFACE结构可以与前文中CLASS结构相对应.
typedef struct _JcIhuman JcIhuman; /* dummy object */typedef struct _JcIhumanInterface JcIhumanInterface;
注意我们typedef了JcIhuman,但实际上并没有真正的定义,我们仅仅需要定义JcIhumanInterface,如下,
struct _JcIhumanInterface { GTypeInterface parent_iface; void (*speak) ();};
Interface中我们自己要定义的只有一个指向函式的指针
当然还是少不了一个类型获取函式和一个对外的函式.
GType jc_ihuman_get_type (void);void jc_people_talk (JcIhuman *self);
下面看如何实现,
GTypejc_ihuman_get_type (void){ static GType iface_type = 0; if (iface_type == 0) { static const GTypeInfo info = { sizeof (JcIhumanInterface), NULL, /* base_init */ NULL, /* base_finalize */ }; iface_type = g_type_register_static (G_TYPE_INTERFACE, "JcIhuman",&info, 0); } return iface_type;}
在GTypeInfo中有两个NULL,分别对应的是base_init和base_finalize
前文中有简单的介绍一个类初始化和终结的过程。
voidjc_people_talk (JcIhuman *self){ g_return_if_fail (JC_IS_IHUMAN (self)); JC_IHUMAN_GET_INTERFACE (self)->speak ();}
如果在调用时,我们传入的肯定是一个实现了该接口的类的实例。所以在调用的时候要使用宏定义JC_HUMAN_GET_INTERFACE.
我们看到上面的结构中并没有定义类似class_init的结构,但并不意味就不定义了,在接口的实现时还是要定义一个名为interface_init结构。假设我们定义的Boy类要实现speak这一Ihuman定义的接口,要增加如下的代码
G_DEFINE_TYPE_WITH_CODE (JcBoy, jc_boy, JC_TYPE_BABY,//); G_IMPLEMENT_INTERFACE (JC_TYPE_IHUMAN, jc_ihuman_interface_init));
这里就不用G_DEFINE_TYPE了,而是使用G_DEFINE_TYPE_WITH_CODE,而这两个宏本身都是对其它宏的简化,因为前文简单介绍过,这里就不展开了。
其中G_IMPLEMENT_INTERFACE是声明这个类要实现接口,并且指定了接口初始化的函式指针,其展开后如下,
#define G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \ const GInterfaceInfo g_implement_interface_info = { \ (GInterfaceInitFunc) iface_init, NULL, NULL \ }; \ g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \}
下面看接口实现的函式
static void speak(){ g_print("la la la ... haha ! I'm a boy!\n");}static voidjc_ihuman_interface_init(JcIhumanInterface *iface){ iface->speak =speak;}
interface_init其中就是简单做了一个指针的赋值,仅此而已。
至此一个接口的定义与实现就完成了。
而调用起来也是比较容易的,
JcBoy *boy = g_object_new (JC_TYPE_BOY, NULL);
jc_people_talk(boy);
0 0
- 使用C语言进行面向对象的开发--GObject入门[8]
- 使用C语言进行面向对象的开发--GObject入门[1] [2]
- 使用C语言进行面向对象的开发--GObject入门[1]
- 使用C语言进行面向对象的开发--GObject入门[2]
- 使用C语言进行面向对象的开发--GObject入门[3]
- 使用C语言进行面向对象的开发--GObject入门[4]
- 使用C语言进行面向对象的开发--GObject入门[5]
- 使用C语言进行面向对象的开发--GObject入门[6]
- 使用C语言进行面向对象的开发--GObject入门[7]
- 使用C语言进行面向对象的开发--GObject入门[9]
- GObject参考手册(10)--GObject的对象属性
- GObject参考手册(2)--概念:GObject的开发背景
- 使用面向对象工具进行着面向过程的开发
- 用C语言进行面向对象编程
- 用C语言进行面向对象编程
- 用C语言进行面向对象编程
- GObject参考手册(8)--基类:GObject
- C语言的面向对象
- SQL Server 2005自动备份数据库
- #pragma mark in Swift?
- 【原创】求最短路径-弗洛伊德算法
- 实现一个Web内容片段收集引擎的设想
- Spring MVC 流程图
- 使用C语言进行面向对象的开发--GObject入门[8]
- 我的第一个shader程序
- &与&&有什么区别?
- LeetCode #96 Unique Binary Search Tree
- RequireJS - 用法
- 用4个骰子表示月份和日期
- 自动装箱与拆箱
- Shader山下(十七)语义Semantic
- select 下拉框和下拉列表美化