首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否使用不是GObject属性的参数初始化GObject?

是否使用不是GObject属性的参数初始化GObject?
EN

Stack Overflow用户
提问于 2011-10-15 20:39:17
回答 2查看 1.6K关注 0票数 3

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

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

我找到的唯一方法是为对象"A“创建相同的属性,并将它们的值传递给"B”的构造函数。这些属性对"A“没有更多的意义,所以这看起来像是一个杂乱无章的东西。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-15 22:57:39

  • B继承了A。然后,A拥有B的所有属性,并使用A中的属性,但改为将B的属性(或者更好的是,一个已经构造的B对象)作为参数传递给AB的constructor.
  • Delay构造,直到A确定它需要如何配置B。向D17、D18或其他位置添加一个私有标志,告诉您指向D20的内部指针是否有效。H221F222

对第二个建议有更多的澄清:

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

代码语言:javascript
复制
A *a_new() 
{
    return (A *)g_object_new(TYPE_A, NULL);
}

您可以轻松地对其进行扩展,以包括其他参数:

代码语言:javascript
复制
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;
}

这样做的缺点是,如果您使用g_object_new构建A对象(例如,如果您试图从GtkBuilder文件构建它),则会使它处于无效状态(即,没有B)。如果这是一个问题,我仍然强烈建议重构。

票数 1
EN

Stack Overflow用户

发布于 2016-09-21 18:49:26

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

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

B派生A只有在它确实是它的父类的专门化时才有意义。

从这个问题看,不清楚派生是否有意义,但它通常是用于组合的overused method

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7777869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档