3

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

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

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

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

4

2 回答 2

1
  • 继承AB. 然后自动A拥有所有B的属性。
  • 不要在 中使用属性A,而是将B的属性(或者更好的是,已经构造的B对象)作为参数传递给A的构造函数。
  • 延迟构造B直到A可以弄清楚它需要如何配置B。添加一个私有标志或其他东西Ab_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;
}

如果您使用 构造它,例如,如果您尝试从 GtkBuilder 文件构建它,这具有使您的A对象处于无效状态(即,没有 a )的缺点。如果这是一个问题,我仍然强烈建议重构。Bg_object_new

于 2011-10-15T14:57:38.917 回答
1

使用依赖注入,将一个已经初始化的类型对象传递BA.

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

A仅当它确实是其父类的专业化时,派生B才有意义。

从这个问题来看,推导是否有意义尚不清楚,但它是一种经常被过度使用的组合方法。

于 2016-09-21T10:49:25.807 回答