2009-05-07 22 views
37

誰かが継承の代わりに委譲をいつ使いたいのですか?継承の代わりに委譲を使用する場合

+5

ここでうまくいっています:http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –

+1

私は答えを展開しませんが、私はこれらの種類のOOの設計上の問題はArthur Rielの優れた本です**オブジェクト指向の設計ヒューリスティックス**です。 http://www.davegardner.me.uk/reading/oo-design-heuristics/ http://www.amazon.co.uk/Object-oriented-Design-Heuristics-Arthur-Riel/dp/020163385X – Dave

答えて

46

あなたが「コピー」/ベース・クラスのAPIを公開したいときは、継承を使用しています。 機能を「コピー」するだけの場合は、委任を使用してください。この

一例: リストのうち、スタックを作成したいです。スタックにはポップ、プッシュ、ピークがあります。スタック内でpush_back、push_front、removeAtなどの機能を必要としないので、継承は使用しないでください。

+2

良いルール親指の。 –

24

彼らはお互いに関係ありません。委任は行動です。継承はモデル手法です。

継承は、モデリングのためにある "-Aです"。コンピュータ「is-a」電子システム。

委任は、メソッドが結果をどのように提供するかです。あるオブジェクトが別のオブジェクトに作業を委任することもあります。委任は、任意の関係を介して行うことができます。スーパークラス、複合または集約のメンバー、または任意の関係に委任できます。

+3

継承は「is-a」関係をモデル化するためのものですが、サブクラスが基本クラスの機能を拡張し、それを制限するものもありません。 – ChadD

+0

@Chadworthington:そうではありません。サブクラスはスーパークラスに委譲せずにメソッドをオーバーライドし、それらを置き換えることができます。 –

+1

@S。Lott:メソッドをオーバーライドすることはできますが、まだ記述されていない可能性のあるものを含めて、制限する動作を公開するすべてのメソッドをオーバーライドするよう注意する必要があります。 @ Chadworthingtonのアドバイスは、特にあなたがスーパークラスを制御していないときは、より安全です。 –

4

あなたは、共通のグループにその機能を簡素化するために、複数の内部クラスのインスタンスへの委任を使用することができます。あなたの言語が複数の継承を実装していない場合は、ベースの1つから継承し、もう一方をラップし、公開する機能を基になる実装に委譲することができます。継承はまた、継承しているクラスの階層にクラスを結び付けます。委任では、自分の階層を維持し、別のクラスに呼び出しを委任することができます。

3

は、あなたのクラスは、Bと呼ばれていると仮定して得られた/に委譲クラスが呼び出された後、ここで

相続または委任が使用されているいくつかの例です:
あなたが表現したい

  • た場合は、関係(is-a)の場合、継承を使用します。
  • クラスを既存のAPIに渡すことができるようにするには、Aを想定して継承を使用する必要があります。
  • あなたはAを強化したいが、Aは最後であり、さらにサブクラス化することはできないので、構成と委任を使用する必要があります。
1

私の意見では、使用するときに委譲を呼び出すことができ、継承はこれまでに埋め込まれています。

は、それがどんなRubyの列挙モジュールのスレッドを実装するInThreadsの委任を使用して、例えばthe in_threads gemください。これにより、配列のin_threadsメソッドを呼び出すだけで、スレッドで実行されます。

関連する問題