2011-09-13 8 views
2

クラスAがクラスBとのコンポジション関係にある場合、クラスAのデータカプセル化を中断しないように、クラスAを介して取得されたBの特定のインスタンスをクラスAで変更可能にする必要がありますか?あるいは、合成はデータのカプセル化ではなく、生涯バインドのみを意味しますか?コンポジション対データカプセル化

class A 
{ 
    B itsB; 
    B* getB() {return &itsB); 
} 

void AnotherClass::anyOperation() 
{ 
    itsA->getB()->function(); // is this legal ? 
} 
+0

C++を使用している場合は、itsA.getB() - > function()である必要があります。 – Bhaskar

+0

itsAがBのitsBとしてインスタンス化されるかどうか、B *のitsB = new B() – bethoven25

+0

前のコメントでは、Aの代わりにBを間違えて記述しました。私はAnotherClassがそのAを "A itsA"としてインスタンス化した場合、それは "itsA"になることを意味します。ただし、A * itsA = new A()としてインスタンス化されている場合は、 "itsA->"になります。 – bethoven25

答えて

2

Bは誰もgetB()を通じてAのBを取得しないとgetB()が一定の基準を返すようにするためにその値が変化することを保証するために、公共のセッター関数、C++における唯一の方法を持っている場合。定数ポインタを返すと、ポインタを変更しないことが保証されます。ポインタが指すB内の値を変更することはできます。

+0

hmm ..私はconstポインタとconstオブジェクトと混同していたと思います。したがって、A内のオブジェクトBへの定数ポインタを返すと、そのオブジェクトに関連付けられた誰もが自由にその操作を呼び出すことができます:) constデータのconstポインタの場合と同じように、そのconst宣言された関数だけでなく、私はそれを持っていると感じている.. – bethoven25

+0

それを明確にするための1つのポイントVanessa ...あなたは "Bがパブリックセッター機能を持っているなら"クラスAはsetB(B * pB)またはsetB(B b)これはAのBを変えますか? – bethoven25

+0

いいえ、BがsetMyField(int fieldValue)のような関数を持っているとか、AのBを取得しsetMyFieldを呼び出すことを防ぐ唯一の方法は、getB()がconst B&を返すようにすることです。 –

2

コンポジションでは、コンポジットオブジェクトがコンポジットクラス外で変更されるかどうかに関する規則が厳密に指定されていません。

カプセル化は、クラス内で定義されたメンバーへの外部へのアクセスを制御することと関係しています。一般に、クラスのフィールドは外部コードによって直接アクセス可能であってはなりません。この信念が守られれば、外部コードによって変更可能にするという問題は生じません。カプセル化と構成は原則的には関連していないので、B自体がAに構成されているという事実はitsBA以外では変更できないという規則を規定していません。

しかし、あなたは1の点で考えるべきです。誰がオブジェクトitsBを所有していますか? 2. Aの外側で変更を許可するのはスレッドセーフですか?カプセル化を破っていますか?

+0

1.オブジェクトの所有者itsB:クラスAはそれを所有しています。そのコンポジションは既にそれを意味しています。クラスAはそれを作成し、使用し、破壊します。私は何かが恋しいと感じます。 2.糸の安全性についてはどうですか?そして、最後に、あなたは "カプセル化を壊していますか?" 「カプセル化と組成は原則的に関連していない」と以前に述べたが私は本当にもっと混乱しています。 – bethoven25

+0

1.これはクラスAのみで管理する必要があります。 2.別のオブジェクトに含まれているオブジェクトをオブジェクトの外側で修正することを許可すると、これは通常複数のスレッドが関わっているときに大きな問題を引き起こすため、このデザインを受け入れる前に注意深く考慮する必要があります3 - フィールドitsBの変更により前後の条件が違反される可能性がありますか?この考察は純粋にカプセル化の観点からのものであり、構成はこのチェックそのものを指示するものではありません。これが助けてくれることを願って。 – Bhaskar

+0

私はこれが古いと知っていますが、私はこれに同意しません。別のオブジェクトの内部にあるオブジェクトをまっすぐ上に置くと、カプセル化が中断されます。親オブジェクトの内部オブジェクトの機能を複製するか、親オブジェクトの機能に子オブジェクトを渡すだけで、それを格納するのではなく、作業することになります。 – user441521

0

異なる言葉で私の問題を言及する:

クラスAは、AとB、AとCは、組成の関係にありヘクトパスカルとMCのメンバーを、持っています。

BクラスとCクラスは関連する関係にあります。

特定のインスタンス「mB」を特定のインスタンス「mC」(クラスA)にリンクして、それらの間で通信できるようにする場合は、どのように言いますか。

mBとmCのAが提供するカプセル化を解除することは意味しますか?

+0

コメントありますか? – bethoven25

+0

Aの2つの合成オブジェクト(BとC)の間のこのオブジェクト間通信が、Aの設計によって予期される前後の条件に違反するかどうかによって異なります。違反していれば、カプセル化が破られます。 – Bhaskar

関連する問題