我有一个GObject“A”,它在构造函数中创建另一个GObject“B”的实例。
“B”对象需要传递几个仅构造属性。现在,当创建对象“A”的实例时,我想允许通过对象“A”的构造函数将这些属性的值传递给对象“B”的构造函数。
我发现这样做的唯一方法是为对象“A”创建相同的属性,并将它们的值传递给“B”的构造函数。这些属性对“A”没有进一步的意义所以这看起来像一个kludge。
有没有更好的方法来做我想要的?
答案 0 :(得分:1)
A
继承自B
。然后A
自动拥有所有B
的属性。A
的属性(或更好的,已构建的B
对象)作为参数传递给B
的构造函数。A
直到B
可以弄清楚如何配置A
。向B
,A
或其他内容添加一个私有标记,告诉您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的组合。