質問は以前に議論されたことがあることを私は知っていますが、それは常に継承が少なくとも時々作曲よりも好ましいという仮定の下にあるようです。ある程度の理解を得るために、その仮定に挑戦したいと思います。
私の質問はこれです:古典的な継承でできるオブジェクトコンポジションで何でも達成でき、古典的な継承は非常に頻繁に悪用されるため[1] 、オブジェクトコンポジションはデリゲートオブジェクトの実行時間を変更する柔軟性を提供するので、なぜこれを使用するのでしょうか古典的な継承?
委任に便利な構文を提供しないJavaやC++などの一部の言語で継承を推奨する理由は理解できます。これらの言語では、明らかに正しくない場合はいつでも、継承を使用することで多くの入力を節約できます。しかし、Objective CやRubyのような他の言語は、古典的な継承と委任のための非常に便利な構文の両方を提供します。Goプログラミング言語は、私の知る限り、古典的な継承は価値があるよりも厄介であり、コードの再利用のための委任のみをサポートすると判断した唯一の言語です。
私の質問を述べる別の方法はこれです:古典的な継承が特定のモデルを実装するのに正しくないことを知っているとしても、その理由は構成の代わりにそれを使用するのに十分ですか?
[1]多くの人は、クラスにインターフェースを実装させる代わりに、古典的な継承を使用してポリモーフィズムを実現します。継承の目的は、ポリモーフィズムではなく、コードの再利用です。さらに、継承を使用して、問題となることが多い「is-a」関係の直感的な理解をモデル化する人もいます。
アップデート
継承について話すとき、私が正確に何を意味するのかを明確にしたいだけです。
私は、クラスが部分的または完全に実装された基本クラスから継承する種類の継承について話しています。私は、インターフェイスを実装するのと同じことになる純粋に抽象的な基本クラスから継承することについて話しているのではありません。
アップデート2
継承がポリモーフィズムiC++を実現する唯一の方法であることを理解しています。その場合、なぜそれを使用しなければならないのかは明らかです。したがって、私の質問は、ポリモーフィズムを実現するための明確な方法(それぞれ、インターフェースとダックタイピング)を提供するJavaやRubyなどの言語に限定されています。