オブジェクト指向プログラミングの典型的な問題はダイヤモンド問題です。親クラス A と 2 つのサブクラス B および C があります。A には抽象メソッドがあり、B と C はそれを実装します。これで、BとCを継承するサブクラス D ができました。ひし形の問題は、D が B の実装と C の実装のどちらを使用するかということです。
人々は、Java はダイヤモンドの問題を知らないと主張します。インターフェイスを使用した多重継承のみを行うことができます。それらには実装がないため、ダイヤモンドの問題はありません。これは本当ですか?私はそうは思わない。下記参照:
【取り外し車両例】
ひし形の問題は常に悪いクラス設計の原因であり、プログラマーもコンパイラーも解決する必要のないものですか?
更新: 私の例の選択が不十分だったのかもしれません。
この画像を見る
(出典: suffolk.edu )
もちろん、Person を C++ で仮想化することもできるため、メモリ内には person のインスタンスが 1 つしかありませんが、実際の問題は解決しません。GradTeachingFellow の getDepartment() をどのように実装しますか? 考えてみてください、彼はある学部の学生であり、別の学部で教えているかもしれません。したがって、一方または他方の部門を返すことができます。問題の完全な解決策はなく、実装が継承されない可能性がある (たとえば、Student と Teacher の両方がインターフェイスになる可能性がある) という事実は、私には問題を解決していないようです。