2011-10-15 4 views
3

私は、そのコンストラクタに別のGObject "B"のインスタンスを作成するGObject "A"を持っています。GObjectプロパティではないパラメータでGObjectを初期化しますか?

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

私が見つけた唯一の方法は、オブジェクト "A"の同一のプロパティを作成し、それらの値を "B"のコンストラクタに渡すことでした。これらのプロパティは "A"には意味がありませんので、これはクルージュのようです。

私がしたいことをする良い方法はありますか?

答えて

1
  • ABから継承しました。その後AにはBのすべてのプロパティが自動的に設定されます。
  • Aでプロパティを使用しないでください。Aのコンストラクタへのパラメータとして、Bのプロパティを渡します(または、既に構築されたBオブジェクト)。
  • Bの遅延構成Aまでは、Bの構成方法がわかります。 Ab_initializedなどのプライベートフラグを追加すると、Aの内部ポインタがBになるかどうかがわかります。

第二の提案のいくつかのより明確:

AのものはマクロG_DEFINE_TYPE()によって提供されるa_init()関数に構成されています。しかし、それはAのインスタンスを取得する方法ではありません。これは、脱離するという欠点がある

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 *a_new() 
{ 
    return (A *)g_object_new(TYPE_A, NULL); 
} 

:それはこのようなAのパブリックインターフェイスの一部である機能を、書き込みするのが一般的ですg_object_newを使用して構築した場合(例えば、Bなしの)、無効な状態のオブジェクト(A)をGtkBuilderファイルから構築しようとしている場合などです。それが問題なら、リファクタリングを強くお勧めします。

+0

残念ながら、どちらも完全に無関係で、プロパティを使用するだけではなく、オブジェクトAを「汚染」します。 – user996839

+0

私はリファクタリングの主要候補者のようです。しかし、私は思ったいくつかの提案を追加します... – ptomato

+0

Aのコンストラクタに非プロパティの引数を渡すことは、私が興味を持っているものに合っているようです。どのようにポインタ/例がありますか? ? – user996839

0

dependency injectionを使用して、すでにBの初期化済みオブジェクトをAのコンストラクタに渡します。

Bのようにクラスを使用しているクライアントが異なる種類のコードを渡すかどうかを決めることができます(クラスの代わりにインタフェースを使用することもできます)。実装に対してコードを記述するよりも優れています)。

ABから派生させるのは、それが本当に親クラスの特殊化である場合にのみ意味があります。

派生が理にかなっているかどうかは不明ですが、構成にはしばしばoverused methodです。

関連する問題