2011-07-30 12 views
0

Iは4つのクラスがあります:A、B、CおよびDアクセス・クラス・インスタンス

Aは本当にメインクラスであり、そしてB、C及びDのインスタンスを有する。

class A() { 

    var B_class : B = new B() 
    var C_class : C = new C() 
    var D_class : D = new D() 

} 

Dクラスには、Cクラスのメソッドを使用するメソッドがあります。しかし、これらのメソッドは、Cクラスの状態を知る必要があります。

だから私の理解が、私はそうのようなDクラスを構築する際にパラメータとしてではCクラスに合格する必要があります:

class A() { 

    var B_class : B = new B() 
    var C_class : C = new C() 
    var D_class : D = new D(C_class) 

} 

しかし、他の問題がC_classもあることD_classからメソッドを使用する必要があるという事実でありますD_classの状態を変更します。すべてが1つのクラスにあれば、それは簡単でしょう。

確かに、私は特定のクラスを取るメソッドを持つことができますが、より良い方法が必要です。私は自分のデザインで何か基本的なことを見落としてしまったと確信しています。

答えて

1

私はこれがあなたのオブジェクト指向言語に適用されるかどうかわからないんだけど、あなたに簡単にC_classCへの参照をDへの参照が含まれているとD_class持つことができます。

class C; 
class D; 

class C 
{ 
    D & otherD; 

public: 
    C(D & d) : otherD(d) { } 
}; 

class D 
{ 
    C & otherC; 

public: 
    D(C & c) : otherC(c) { } 
}; 

class A 
{ 
    C myC; 
    D myD; 

public: 
    A() : myC(myD), myD(myC) { } 
}; 

キーはそれが可能だということです不完全な型へのポインタと参照を持ちます。相互にネストされた実際のメンバーは必要ありません(これは意味がありません)が、参照のみなので、このような循環参照を簡単に持つことができます。

0

CにSetDメソッドを追加することも、Cを作成してCを構築してCを構築することもできますが、これは不可能です。明示的なSetDでない場合、Dのメソッドを必要とするCのメソッドへの引数としてDを渡すと、潜在的にうまくいく可能性があります。

+0

参考の周りを回ってうまくいく - 本当にそれを避けたい。 –

+0

別の方法は、Cが自身を参照として渡すことによってDを作成するようにします。 'C:d = new D(this)'と 'D:constructor(c:C)'にあります。 –