誰かが継承の代わりに委譲をいつ使いたいのですか?継承の代わりに委譲を使用する場合
答えて
あなたが「コピー」/ベース・クラスのAPIを公開したいときは、継承を使用しています。 機能を「コピー」するだけの場合は、委任を使用してください。この
一例: リストのうち、スタックを作成したいです。スタックにはポップ、プッシュ、ピークがあります。スタック内でpush_back、push_front、removeAtなどの機能を必要としないので、継承は使用しないでください。
良いルール親指の。 –
彼らはお互いに関係ありません。委任は行動です。継承はモデル手法です。
継承は、モデリングのためにある "-Aです"。コンピュータ「is-a」電子システム。
委任は、メソッドが結果をどのように提供するかです。あるオブジェクトが別のオブジェクトに作業を委任することもあります。委任は、任意の関係を介して行うことができます。スーパークラス、複合または集約のメンバー、または任意の関係に委任できます。
継承は「is-a」関係をモデル化するためのものですが、サブクラスが基本クラスの機能を拡張し、それを制限するものもありません。 – ChadD
@Chadworthington:そうではありません。サブクラスはスーパークラスに委譲せずにメソッドをオーバーライドし、それらを置き換えることができます。 –
@S。Lott:メソッドをオーバーライドすることはできますが、まだ記述されていない可能性のあるものを含めて、制限する動作を公開するすべてのメソッドをオーバーライドするよう注意する必要があります。 @ Chadworthingtonのアドバイスは、特にあなたがスーパークラスを制御していないときは、より安全です。 –
あなたは、共通のグループにその機能を簡素化するために、複数の内部クラスのインスタンスへの委任を使用することができます。あなたの言語が複数の継承を実装していない場合は、ベースの1つから継承し、もう一方をラップし、公開する機能を基になる実装に委譲することができます。継承はまた、継承しているクラスの階層にクラスを結び付けます。委任では、自分の階層を維持し、別のクラスに呼び出しを委任することができます。
は、あなたのクラスは、Bと呼ばれていると仮定して得られた/に委譲クラスが呼び出された後、ここで
相続または委任が使用されているいくつかの例です:
あなたが表現したい
- た場合は、関係(is-a)の場合、継承を使用します。
- クラスを既存のAPIに渡すことができるようにするには、Aを想定して継承を使用する必要があります。
- あなたはAを強化したいが、Aは最後であり、さらにサブクラス化することはできないので、構成と委任を使用する必要があります。
私の意見では、使用するときに委譲を呼び出すことができ、継承はこれまでに埋め込まれています。
は、それがどんなRubyの列挙モジュールのスレッドを実装するInThreadsの委任を使用して、例えばthe in_threads gemください。これにより、配列のin_threadsメソッドを呼び出すだけで、スレッドで実行されます。
- 1. 継承の代わりに合成
- 2. 継承の代わりにコンポジションを使用
- 3. 委譲パターン用UML
- 4. 継承の代わりにテンプレートを使用するのはいつですか?
- 5. pxの代わりにemを使用する場合のベストプラクティス
- 6. 「fun」の代わりに「function」を使用する場合
- 7. std :: setの代わりにstd :: unordered_setを使用する場合
- 8. 継承を使用する場合の未解決の参照
- 9. Websphereクラスローダー委譲モード
- 10. Javaで継承またはインタフェースを使用する場合?
- 11. Goの継承の代わりに埋め込み
- 12. 不器嫌な継承の代わりにフィルタ/構成パターン?
- 13. SVG要素のイベント委譲
- 14. pythonサブプロセスの入力委譲
- 15. 継承の代わりにカプセル化するクラスを変更する
- 16. TObjectListから継承する方法TObjectListから継承する代わりに<T>
- 17. イベントをjQueryに委譲する方法はありますか?
- 18. gethrtime()の代わりにgethrvtime()を使用する方が適切な場合
- 19. IIS7.5 MVC \ Formsサブアプリケーションの継承を実行する代わりにダウンロード
- 20. シンプルクロックアプリケーション:毎秒委譲またはコールバックを使用しますか?
- 21. この場合、継承または合成を使用すべきですか?
- 22. modalViewControllerはコールバックを委譲します - HowTo?
- 23. 単一テーブル継承の場合のフォームヘルパー
- 24. 複数の継承の場合にvptrを選択する
- 25. ActionScript 3にはイベント委譲システムがありますか?
- 26. トーストを使用する代わりに
- 27. #defineと#ifを使用する場合、YES/NOを使用する代わりに、
- 28. GetDesktopWindowの代わりにサービスとして実行する場合
- 29. のMathematica:利用区分の代わりの場合
- 30. Gileadを使用して継承を継承するクラス
ここでうまくいっています:http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –
私は答えを展開しませんが、私はこれらの種類の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