2017-08-02 4 views
2

他のオブジェクトと最初のオブジェクトの中のオブジェクトは、どのようにして合成オブジェクトの背後にあるコードを再利用できますか?また、合成オブジェクトの意味は実行時に決定できますか?コンポジション(別名アソシエーション)は再利用を達成するためのもう1つの手段ですか?

class Calculator 
{ 
    private: 
     long double operand_1; 
     long double operand_2; 
     long double result; 
     int optr; 
     int multiplier; 
     Button One; 
     //Button Two.. 
     //..through Nine 
     Button Zero; 
} 

class Button 
{ 
    private: 
     int x1; 
     int y1; 
     int x2; 
     int y2; 
     char Label[55]; 

    public: 
     Button(); 
     int hit(); 
     void show(); 
     void press(); 
     void select(); 
} 
私は正しい方向に向かっかよかどうかわからない

が、私は「構成オブジェクトは実行時に決定することができますか?」ここ ボタンが構成されての意味を知りたいと思った 計算機クラスで

答えて

0

この原則は、Effective Java Bookで 'Item 16'として示されています。 「コード再利用のための継承を優先する」と言われたとき、「合成」という言葉はUMLの本当の構成の精神ではなく、「封じ込め」または「関連」の同義語として使用されると思います。ジョシュア・ブロッホの「効果的なJava」は、「項目16」の良い例です。

上記のデモの例では、包含のインスタンス(Setのサブクラス)はコン​​ストラクタを経由して渡され、コンポジションを破る(クライアントによって)常にキャッシュされます。本のデモでも、それは封じ込めの場合であり、純粋な合成(合成されたオブジェクトは外部に知られていない)ではありません。

コード再利用は、「継承(ホワイトボックス)」と「包含(ブラックボックス)」の​​2つのメカニズムで実現できます。ブラックボックスの再利用の場合、抽象基本クラス/インタフェースの参照に対して子クラスのインスタンスを割り当てることにより、再利用可能なクラスを実行時に結合することができます。原則として継承は 'IsA'関係が存在する場合にのみ使用されるべきであり、オブジェクトの互換性を使用して多態的な動作の利点を得たいと考えています。

例では、CalculatorはButtonを使用していますが、動的な子クラスインスタンスは必要ありません。しかし、addActionListener()を呼び出すと、ButtonクラスはContainmentによってActionListenerを使用しますが、代わりにActionListenerを使用します。

以下は、Compositionによるコードの再利用の例です。そのListインスタンスはPackOfCardの外部からはわかりませんが、内部的にPackOfCardsはすべての機能をConcrete Listに委譲しています。

public class Card { 
    public enum Suit{SPADE, HEART,DIAMOND,CLUB} 
    public enum Rank{ACE,QUEEN,KING}// and others 
    private Suit suit; 
    private Rank rank; 
    public Card(Suit suit, Rank rank) { 
     this.suit = suit; 
     this.rank = rank; 
    } 
} 
public class PackOfCards { 
    private List<Card> cards; 

    public PackOfCards() { 
     cards = new LinkedList<Card>(); 
    } 

    public Card getCard(int index){ 
     return cards.get(index); 
    } 

    public void shuffle(){ 
     Collections.shuffle(cards); 
    } 
    // other methods 
} 
+0

これは、オブジェクト参照を渡すことは、新しいまたは新しいButton()およびButton Oneを使用してButtonオブジェクトを呼び出すことを意味するものではありません。異なる。私たちもそのオブジェクトを嘲笑することが許されていますか? –

+0

ボタンをインスタンス化して電卓内に厳密に保持するか、外部から渡すかは、厳密な合成かどうかを決定しますが、いずれの場合でもブラックボックスの再利用を利用しています。 Buttonのメソッド/属性を再利用するためにCalculatorをButtonから継承している場合、White Boxの再利用を行っています(これはここではうまくいかない)。 –

+0

更新してくれてありがとう、本当に役立つだろうここで厳密な組成を詳しく教えてもらえますか? –

関連する問題