構成とは、クラスから継承するのではなく、既にこの機能を実装している(おそらく内部の)クラスをインスタンス化することにより、クラスが機能を提供することです。
たとえば、船をモデル化するクラスがあり、船がヘリポートを提供するように指示されている場合、ヘリポートから船を派生させるのは自然ではありません(代わりに!)船にはヘリポートクラスが含まれており、何らかのShip.getHelipad()
メソッドで公開しています。
数年前(10年ほど前)に人々は機能を集約するための迅速かつ簡単な方法として継承を見ていました。
しかし、「継承よりも好意的な構成」の言葉は、これが単なる提案であり、規則ではないことを明確にするために慎重に表現されています。の作者は、「あなたは決して継承を使わず、作曲のみ」というようなことを言わないように十分に注意していました。これは基本的に、ソフトウェアエンジニアリングコミュニティの関心を引き継いでいますが、多くの場合、コンポジションは継承よりも明確でエレガントで保守可能なデザインを生成します。
したがって、本質的に、「継承よりもお気に入りの構成」の原則は、「継承するか、構成するか」に直面したときはいつでも示唆しています。質問、あなたは最も適切な戦略は何であるか一生懸命に考えるべきであり、最も適切な戦略は継承ではなく構成であることが判明するということです。
ただし、これはルールではないため、継承がより自然な場合が多くあることにも留意してください。継承を使用する必要がある場所で構成を使用すると、コードに多くの悪が生じます。
船の例に戻ると、船がとやり取りするためのインターフェースを提供する必要がある場合FloatingMachine
、抽象FloatingMachine
クラスから派生する方が自然Machine
です。
構成対継承の質問に対する答えの経験則は次のとおりです。
私のクラスは、公開する必要があるインターフェースと「関係」がありますか?はいの場合、継承を使用します。そうでない場合は、構成を使用します。
船は「浮遊」機であり、浮遊機は「浮遊」機です。したがって、継承はそれらにとって完全に問題ありません。しかし、船はもちろんヘリポートではありません。そのため、ヘリパッドの機能をより良く構成します。