人々は C++ の継承は悪だと言うので、Java はこのインターフェースの問題を「修正」しました。
しかし、Scala はtrait
s を導入しました。それらは... 部分実装のインターフェイスですか? これは多重継承を復活させませんか?
Scala の人たちは多重継承が良いと思っているということですか? または、私が気づいていない重大な違いがありますか?
多重継承の最悪の部分は、サブクラスが連鎖のどこかで同じ親への 2 つ以上のパスを持つダイヤモンド継承です。これにより、実装が 2 つのパスに沿って異なる場合 (つまり、元の実装からオーバーライドされる場合) があいまいになります。C++ では、解決策は特に醜いです。互換性のない親クラスを両方とも埋め込み、必要な実装をいつ呼び出すかを指定する必要があります。これは紛らわしく、すべての呼び出しサイトで余分な作業が発生し (または、明示的にオーバーライドして必要なものを指定する必要がある可能性が高くなります。この手動作業は面倒で、エラーの可能性が生じます)、オブジェクトがより大きくなる可能性があります。彼らはそうあるべきです。
Scala は、多重継承をトレイトに制限することで、すべてではありませんがいくつかの問題を解決します。トレイトにはコンストラクターがないため、最終的なクラスは継承ツリーを線形化できます。つまり、共通のスーパー親に戻るパス上の 2 つの親は、名目上は両方とも親ですが、1 つが「正しい」もの、つまり 1 つです。最後に記載。この方式では、(完全にジェネリックな) コンストラクターを持つことができれば、途中で初期化された壊れたクラスが残りますが、そのままでは、クラスを 2 回埋め込む必要はありません。起こりました。ただし、多くの特性を互いに重ね合わせたときに何が起こるかを推論するのはそれほど簡単ではありません。また、 と の両方から継承する場合B
はC
、の実装の一部とB
の実装の一部C
。
したがって、C++ モデルに対する最も深刻な批判のいくつかに対処しているという点で優れています。それが十分に良いかどうかは好みの問題です。多くの人が C++ の多重継承の味が好きで、それを使用するほどです。