web-dev-qa-db-ja.com

「継承と合成の代替」

可能性のある複製:
この「継承よりも構成を好む」という概念はどこから来たのですか?

「継承はアンチパターンである」と主張し、代わりに系統的に構成を使用したいという同僚が職場にいます。ただし、継承が本当に最善の方法である場合はまれです。

継承を引き続き使用する別の方法を提案したいのですが、派生クラスで基本クラスのパブリックメンバー以外のものを使用することは厳しく禁止されています(コードレビューによって強制されます)。

実行時にクラスのコンポーネントを交換する必要がない場合(静的継承)、それは構成するのに十分でしょうか?それとも、作曲のその他の重要な側面を忘れていますか?

5
Frank

あなたはそれを逆に見ているようなものです。構成には目に見えない利点があるため、構成は優先されません。継承の欠点を回避できるため、構成は優先されます。継承は代替性の重要な利点を追加します。ただし、その利点は、密結合のかなりのコストが伴うことです。継承は、可能な限り最強の結合関係です。代替可能性が必要ない場合、カップリングコストは価値がありません。

制限されたバージョンの継承は、他のコストであるカプセル化の損失に対処しますが、結合のはるかに重要なコストについては何もしません。

11
Karl Bielefeldt

二つの違いは彼らの意図にあると思います。作成しているクラスは、本当にそのBaseクラスの置き換え/特殊化として使用することを意図しているか、それとも単にいくつかの機能を使用しているだけですか?最初のケースが当てはまる場合は、継承を使用する必要があります。後者が本当なら作曲に行きます。私の経験では、構成が適切である場合に継承を使用すると、より複雑で理解しにくく意味のあるコードベースが作成されます。

4
Lesstat