ここに私の2セントがあります(すでに挙げられているすべての優れたポイントを超えています):
私見、それはほとんどのプログラマーが実際に継承を得ないという事実に帰着し、そしてこの概念がどのように教えられているかの結果として、それを無理やり終わることになる。この概念は、彼らに正しいやり方を教えることに集中するのではなく、彼らにそれをやりすぎないように説得する方法として存在します。
教えるかメンタリングに時間を費やした人は誰でも、これが頻繁に起こること、特に他のパラダイムの経験がある新しい開発者であるということを知っています:
これらの開発者は当初、継承はこの恐ろしい概念であると感じています。そのため、インターフェイスのオーバーラップ(たとえば、共通のサブタイピングのない同じ指定された動作)と、共通の機能を実装するためのグローバルを使用して、タイプを作成します。
その後(多くの場合、熱心な教育の結果として)、彼らは継承の利点について学びますが、それはしばしば再利用するための包括的なソリューションとして教えられます。共有された動作は継承を通じて共有されなければならないという認識に終わります。これは、サブタイプではなく実装の継承に重点が置かれることが多いためです。
ケースの80%で十分です。しかし、残りの20%は問題が始まる場所です。書き換えを回避し、実装の共有を活用したことを確認するために、基になる抽象化ではなく、目的の実装を中心に階層の設計を開始します。「スタックが二重にリンクされたリストから継承する」は、この良い例です。
ほとんどの教師は、この時点でインターフェイスの概念を導入することを主張しません。それは別の概念であるため、または(C ++では)この段階では教えられない抽象クラスと多重継承を使用してそれらを偽造する必要があるためです Javaでは、多くの教師は「多重継承なし」または「多重継承は悪」とインターフェースの重要性を区別しません。
これはすべて、実装継承で余分なコードを書く必要がないという美しさの多くを学んだという事実によってさらに複雑になり、大量の単純な委任コードは不自然に見えます。そのため、構成は複雑に見えるため、これらの経験則を使用して、新しいプログラマーにとにかく使用してもらう必要があります(これもやりすぎです)。