質問:Composition over inheritanceについて
オブジェクト指向の勉強をしているなかで、"Composition over inheritance"というフレーズを見かけたのですが、よく分からなかったので質問させてください。非常にブロードな中身は承知しておりますので、teratailにふさわしくなければご指摘ください。
オブジェクト指向
表題のComposition over inheritanceを調べる中で、次のようなQiitaの記事(
オブジェクト指向と10年戦ってわかったこと)を見つけました。この中では初めに、
オブジェクト指向は「カプセル化」「継承」「ポリモーフィズム」の3つの原則を守ることで成り立つ
とあります。ただ、この記事の中ほどで、
継承は親クラスの機能を受け継ぐ機能です。しかしこれは継承の本質ではありません。
継承の本質はインターフェイスです。
とあります(太字のハイライトは質問者である私が付けました)。記事ではJavaを題材にインターフェイスを説明しており、これによってポリモーフィズムを実現している、とあります。
そのあとの内容も読んだ上での理解としては、例えばクラスAを継承したクラスBは、
- 「B is A」の関係にある => クラスBが「何であるか」を重視??
- 親クラスの機能も引き継ぐ
という特徴がある一方で、Compositionだと(必要な要素をまとめあげることによって)、
- クラスA, クラスBはそれぞれ「何ができるか」を重視する。
- インターフェイスは共通だが、必ずしも機能を引き継ぐ必要はない。
と特徴づけられると考えました。
質問内容
上記の二つ(継承とインターフェイス)はお互いに排反なするものではなく、共存するものだと承知しているのですが、なぜ「Composition over inheritance」と言われるようになったのでしょうか。
設計などの柔軟性が上がる、等のデザインパターンの優位性を訴えるものも見かけたのですが、経験が浅くいまいちピンときませんでした。もしよろしければこのフレーズの背景や、実際に役に立った等の情報をお教え願えませんでしょうか。
長くなりましたが、どうぞよろしくお願いします。
補足情報(FW/ツールのバージョンなど)
調べてみたもの一覧。
https://en.wikipedia.org/wiki/Composition_over_inheritance
https://www.youtube.com/watch?v=wfMtDGfHWpA
https://medium.com/humans-create-software/composition-over-inheritance-cb6f88070205
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/19 09:26