在glib的GObject中,我混淆了从父类派生的子类的实例对象是否继承了父类的属性?

时间:2015-12-31 10:56:48

标签: c linux ubuntu glib gobject

第一期:
在GObject中,我混淆了从父类派生的子类的实例对象是否继承了父类的属性? 第二期:
在GObject中,g_object_class_install_properties函数在类初始化函数中将属性添加到自身类中,但实际上,类的每个实例对象的这些属性都有一个副本。换句话说,类的每个实例对象都有这些属性的副本。

另外,我读了GObject代码片段。 在Gobject.c文件中的以下代码中:

class->set_property = g_object_do_set_property;
class->get_property = g_object_do_get_property;

首先 什么时候调用上面的函数? 其次 如果从父类子类派生的子类重写这些motheds(set_property和get_property),那么如果g_object_new创建新的子类实例并设置属性值,则只调用set_property回调函数,在调用子类set_property之后是否调用了父类的set_property方法?
我不知道在只调用子类的set_property后,是否一次调用父类的set_property方法?

如果您知道这些问题,请花时间回顾我的问题,非常感谢您。

1 个答案:

答案 0 :(得分:1)

如果您还没有看到 GNOME Developer 网站,则会有几页与您提出的问题相关的有用信息。下面指向的链接包含非常简单的示例代码,后面是对代码中发生的事情的非常详细的描述。我在下面引用(和链接)的示例页面专门解决了您的问题,但周围页面中提供了更多有关该主题的内容。

第一期:

  

可导出的类型可以进一步子类化,它们的类和   实例结构构成了公共API的一部分,而不是必须的   如果关注API稳定性,则会更改。他们被宣布使用   G_DECLARE_DERIVABLE_TYPE:

请参阅此处的示例: 的 G_DECLARE_DERIVABLE_TYPE()

第二期:

  

对象属性的泛型get / set机制。当一个物体是   实例化后,应该使用对象的class_init处理程序   使用注册对象的属性   g_object_class_install_properties。

请参阅此处的示例: Object properties

我相信你的具体问题:
何时上述函数被调用?
在上面的对象属性链接中的这些以及周围的段落中已经解决了很多细节:

  

如果用户的GValue已设置为有效值,    g_object_set_property 会继续调用对象' s   set_property类方法。在这里,我们实现了Foo   覆盖此方法后,执行将跳转到foo_set_property   已经从GParamSpec中检索到了param_id [4]   由 g_object_class_install_property 存储。

     

一旦该对象的set_property类设置了该属性   方法,执行返回 g_object_set_property ,这确保了   那个"通知"信号是在对象的实例上发出的   将属性更改为参数,除非通知被冻结   的 g_object_freeze_notify