C#が多重継承をサポートしていないのはなぜですか?


10

たとえそれが悪い慣行かもしれないとしても、私はそれがその目的を果たす時があると言います。


1
私は、Microsoftが生み出すものにまったく役立つ機能がないために、誰もがこれらすべての言い訳をする方法が大好きです(MVPは特にこれに長けています)。私の推測では、多重継承の利点を理解していない人のほとんどは、最初から継承を理解していない(そして使用していない)のです。どこにでもあるほぼすべてのプロジェクトで、コードを20回貼り付けます。マイクロソフトがMIを実装することを決定した場合、間違いなく誰もが突然意地悪な熱狂者になり、「伝道者」になるのを待つ

1
@DaveZifferでしょうが、正しく理解するのは難しいようです。本当にうまく機能する言語や実装を知っていますか?

4
@Daveまたは、その有用性を過大評価しています。一般に継承は過大評価されており、不足しているケースはインターフェースと構成を使用して簡単にモデル化できます。C#では多重継承は実際には役に立たない。唯一の利点は、複合メンバーの実装にインターフェースメソッドを手動で委任する必要がなくなることです。これは(たとえば、ミックスインを導入することで)よりよく解決できたかもしれませんが、多重継承を導入するのは良い理由ではありません。
Konrad Rudolph

私は長年JavaでOOをコーディングしており、継承を合理的に使用しています(多くの場合、よく学ぶと少なくなります)、多重継承を回避するのが本当に困難であった時期を1回、おそらく10回見つけました現在の設計を簡素化するためにそれを使用できた場合、多重継承を必要とせず、全体的な設計をそれよりも優れたものにするために再設計できなかった場合はまったくゼロでした。
Bill K

回答:


14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-cはこの質問をうまくカバーしています。

私の見解は次のとおりです。おそらくデザイナーは、優れたデザイン原則を促進する言語を作りたかったのでしょう。OK、多重継承が完璧な場合があります。ただし、これらは規則ではなく例外であり、非常に簡単に悪用される可能性があります。それで、デザイナーはそれを不可能にすることにしました。

それが良いと思われる場合は、インターフェースを使用する必要があります。ぎこちなくても、これらは機能します。しかし、それほど多くは必要ありません。


8

なぜそうでないのかを説明するために、多重継承はC ++でサポートされていますが、MIと同じように構成することでほとんどのことを達成できますが、よりクリーンな方法で強くお勧めします。C ++とは異なり、C#は「ハイブリッド」タイプのOOP言語ではありません。つまり、以前の言語から進化していません。

多重継承が本当に必要な場合は、複数のインターフェースを実装できます。


6

Walter Brightは、MIを含まないDの作成者であり、C ++コンパイラ全体を自分で作成する唯一の人物です。彼によると、DがMIを欠いている理由は、同時に効率的でシンプルで便利なMIのシステムを作成するのが難しいためです。JavaとC#は同様の推論を使用していると思います。PerlやPythonなどの言語は、主要な目標として効率性を持たないため、シンプルで便利なシステムを備えていますが、効率的に実装することは困難です。C ++は単純さが目標ではないようで、ほとんど誰も理解できない非常に複雑なシステムを作成しました。

Walterは的を射ていると思います。これらの3つの基準を合理的にすべて満たすMIシステムを持つ言語が存在する場合は、コメントを残してください。


2
エッフェル、Common Lisp、ディランについてどう思いますか?3つすべてがシンプルで便利であることは知っています。そして、私はCommon LispとDylanの両方がC ++(そして多くの場合はC)のパフォーマンスと競合し、さらにはそれを上回ることができることを知っているので、効率は満足できるようです。私はないエッフェルのことを知っているコンパイラは恐ろしく遅いですが、私は次のそれが生成するコンパイルされたコードのパフォーマンスについて何も知っています。
イェルクWミッターク


-1

言語設計者は明らかに、一般的にはより優れた言語ではなく、より優れたC ++を作成したいと考えていたためです。(彼らがどれほど成功したかは議論の余地があります。)

C ++スタイルの多重継承にはいくつかの問題があるため、C ++から派生した人々は一般にそれを省略しました(Java、C#、D)。他の言語、EiffelとCommon Lispは2つを挙げますが、それを異なる方法で行い、同じ問題を抱えているようには見えません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.