web-dev-qa-db-ja.com

継承の代わりに委任を使用するのはいつですか?

誰かが継承ではなく委任をいつ使用したいか説明してもらえますか?

46
Cuga

基本クラスのAPIを「コピー」/公開する場合は、継承を使用します。機能を「コピー」するだけの場合は、委任を使用します。

この1つの例:リストからスタックを作成するとします。スタックには、ポップ、プッシュ、ピークのみがあります。スタックにPush_back、Push_front、removeAtなどの機能が必要ない場合は、継承を使用しないでください。

58
Anzurio

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

継承は「is-a」をモデル化するためのものです。コンピュータの「is-a」電子システム。

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

27
S.Lott

複数の内部クラスインスタンスへの委任を使用して、機能を共通のグループに簡略化できます。たとえば、言語が多重継承を実装していない場合は、一方のベースから継承してもう一方をラップし、基盤となる実装に公開する機能を委任することができます。継承はまた、クラスを継承元のクラスの階層に結び付けます。委任と同様に、自分の階層に自分の場所を保持し、呼び出しを別の階層に委任できます。

4
Adam Markowitz

あなたのクラスがBと呼ばれ、クラスの派生/委任がAと呼ばれているとします

継承または委任が使用されている場合の例をいくつか示します。
もし

  • 関係を表現したい場合(is-a)、継承を使用したい場合。
  • aを期待する既存のAPIにクラスを渡せるようにするには、継承を使用する必要があります。
  • aを拡張したいが、Aは最終的なものであり、それ以上サブクラス化できない場合は、構成と委任を使用する必要があります。
3
lothar

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

in_threads gem を例に取ると、InThreadsデリゲーターを使用して、任意のRuby Enumerableモジュールのスレッドを実装します。これにより、配列でin_threadsメソッドのみを呼び出し、スレッドで実行します。

1
Aston

@Anzurioに同意します。簡単な言葉で説明すると:

新しいクラスが既存のクラスの自然な拡張であると思われる場合にのみ、継承を使用してください。特定のメソッドを使用するなど、他のすべての目的には合成/委任を使用することをお勧めします。

0
abhay anand