3

コンストラクターで別の GObject "B" のインスタンスを作成する GObject "A" があります。

「B」オブジェクトには、いくつかの構築専用プロパティを渡す必要があります。オブジェクト「A」のインスタンスを作成するとき、オブジェクト「A」のコンストラクターを介してこれらのプロパティの値をオブジェクト「B」のコンストラクターに渡すことができるようにします。

私が見つけた唯一の方法は、オブジェクト「A」の同一のプロパティを作成し、それらの値を「B」のコンストラクターに渡すことでした。これらのプロパティは「A」にとってそれ以上の意味を持たないため、これはお世辞のようです。

私がやりたいことをするためのより良い方法はありますか?

4

2 に答える 2

1
  • からA継承しBます。次に、のAすべてBのプロパティが自動的に設定されます。
  • でプロパティを使用しないでくださいA。代わりに、Bのプロパティ(またはさらに良いのはすでに構築されたBオブジェクト)をパラメータとしてA'コンストラクタに渡します。
  • Bまでの構築を遅らせるAことで、構成がどのように必要かを理解できますB。の内部ポインタが有効かどうかAを示すプライベートフラグなどを追加します。b_initializedAB

2番目の提案に関するもう少し説明:

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に、オブジェクトが無効な状態(つまり、なし)のままになるという欠点があります。それが問題である場合でも、リファクタリングを強くお勧めします。Bg_object_new

于 2011-10-15T14:57:38.917 に答える