分类: LINUX
2009-08-23 08:24:49
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静
在glib对象系统中,一般的类都是从Gobject类继承过来的。尽管glib是用C语言开发的,它却几乎支持所有的面向对象的特性。这里不谈glib的面向对象机制,只是说说关于GObject对象属性的一些问题。
在OOP中,对象的属性一般用成员变量来表示。编程高手常常告诫我们,把对象的属性隐藏起来,用成员函数去访问,可以减少与使用者之间的耦合,同时可以提高程序的健壮性。
实际上,仅仅是把对象的属性封装起来,有时是不够的。比如,你无法通过基类的指针去访问子类的属性。要做到这一点,需要把这些 setter/getter函数实现成虚函数,在子类中去重载它们。不过,这样做会让基类的接口显示很庞杂,而且实际上你也无法预知子类中的会有哪些属 性。
另外一个更重要问题是,有时候外部对象可能会关心某个对象的属性改变。比如,像对话框可能关心其上控件的属性的变化,控件的属性变化时,对话框需要做一些调整。如果能实现一种机制支持这种功能将有很大用处。
Gobject定义了两个函数(get_property/set_propery),用于存取对象的属性,在子类中重载这两个函数就行了,不用实现一大堆setter/getter函数,同时它提供了一种对象属性监视机制,在对象属性改变时通知相关关注者。