使用非GObject属性的参数初始化GObject?

时间:2011-10-15 12:39:17

标签: c glib gobject

我有一个GObject“A”,它在构造函数中创建另一个GObject“B”的实例。

“B”对象需要传递几个仅构造属性。现在,当创建对象“A”的实例时,我想允许通过对象“A”的构造函数将这些属性的值传递给对象“B”的构造函数。

我发现这样做的唯一方法是为对象“A”创建相同的属性,并将它们的值传递给“B”的构造函数。这些属性对“A”没有进一步的意义所以这看起来像一个kludge。

有没有更好的方法来做我想要的?

2 个答案:

答案 0 :(得分:1)

  • A继承自B。然后A自动拥有所有B的属性。
  • 请勿在{{1​​}}中使用属性,而是将A的属性(或更好的,已构建的B对象)作为参数传递给B的构造函数。
  • 延迟构建A直到B可以弄清楚如何配置A。向BA或其他内容添加一个私有标记,告诉您b_initialized指向A的内部指针是否有效。

关于第二个建议的更多澄清:

B的内容是在A宏提供的a_init()函数中构建的。但这不是你获得G_DEFINE_TYPE()实例的方式。通常编写一个函数,它是A的公共接口的一部分,如下所示:

A

您可以轻松扩展此选项以包含其他参数:

A *a_new() 
{
    return (A *)g_object_new(TYPE_A, NULL);
}

如果您使用A *a_new(int b_param_1, int b_param_2) { A *a = (A *)g_object_new(TYPE_A, NULL); a->priv->b = b_new(b_param_1, b_param_2); return a; } 构建A对象,例如如果您正在尝试将B对象置于无效状态(即没有g_object_new)从GtkBuilder文件构建它。如果这是一个问题,我仍然强烈建议重构。

答案 1 :(得分:0)

使用dependency injection,将已初始化的B类型对象传递给A的构造函数。

这样,使用你的类的客户端可以决定是否传入不同类型的B(如果有意义你甚至可以使用接口而不是类作为B类型,编写针对接口的代码通常比针对实现编写代码更好。

A中获取B只有在它确实是其父类的专业化时才有意义。

从问题来看,如果推导有意义,则不清楚,但它通常是overused method的组合。