継承の代わりに委任を使用したい場合を誰かに説明してもらえますか?
6 に答える
基本クラスのAPIを「コピー」/公開する場合は、継承を使用します。機能を「コピー」するだけの場合は、委任を使用します。
この一例:リストからスタックを作成したい。スタックには、ポップ、プッシュ、およびピークのみがあります。push_back、push_front、removeAtなど(スタック内の機能の種類)が必要ない場合は、継承を使用しないでください。
彼らはお互いに何の関係もありません。委任は動作です。継承はモデル手法です。
継承は「is-a」をモデル化するためのものです。コンピュータは「is-a」電子システムです。
委任は、メソッドが結果を提供する方法です。あるオブジェクトが別のオブジェクトに作業を委任する場合があります。委任は、任意の関係を介して行うことができます。スーパークラス、コンポジットまたはアグリゲートのメンバー、または任意の関係に委任できます。
複数の内部クラスインスタンスへの委任を使用して、それらの機能を共通のグループに単純化することができます。たとえば、言語が多重継承を実装していない場合は、ベースの1つから継承し、もう1つをラップして、基盤となる実装に公開する機能を委任することができます。継承はまた、クラスを継承しているクラスの階層に結び付けます。委任の場合と同様に、自分の場所を自分の階層に保持し、呼び出しを別の階層に委任することができます。
クラスがBと呼ばれ、クラスに派生/委任されたものがAと呼ばれると仮定します。
継承または委任が使用されている場合のいくつかの例を次に示します。
- 関係(is-a)を表現したい場合は、継承を使用します。
- Aを期待する既存のAPIにクラスを渡すことができるようにする場合は、継承を使用する必要があります。
- Aを拡張したいのですが、Aは最終的なものであり、それ以上サブクラス化することはできません。その場合は、構成と委任を使用する必要があります。
私の意見では、委任は、使用するときであり、継承が組み込まれているときに呼び出すことができます。
たとえば、 in_threads gemを例にとると、InThreadsデリゲーターを使用して、RubyEnumerableモジュールのスレッドを実装します。これにより、配列でin_threadsメソッドを呼び出すだけで、スレッドで実行されます。
@Anzurioに同意します。簡単な言葉でそれを説明するだけです:
継承は、新しいクラスが既存のクラスの自然な拡張であると思われる場合にのみ使用してください。特定の方法を使用するなど、他のすべての目的で構成/委任を使用することをお勧めします。