为什么C#不支持多重继承?


10

即使这可能是不好的做法,我也会说有一段时间它会实现其目标。


1
我只是喜欢每个人都为所有这些借口而辩解,因为无论微软生产什么产品,都缺乏完全有用的功能(MVP尤其擅长于此)。我的猜测是,大多数不了解多重继承的好处的人一开始就是不了解(也不使用)继承的人,因为他们更喜欢广受欢迎的复制和复制。我几乎在每个地方的每个项目中看到的代码粘贴20次。毫无疑问,当微软决定实施MI时,所有人都会突然成为精明的爱好者,不用等待“传播家”,声称

1
@DaveZiffer可能是,但似乎很难解决。您是否知道某种语言或实现效果很好的地方?

4
@Dave或者您只是高估了它的用处。通常,继承是一种高估方式,使用接口和组合可以轻松地对遗失案例进行建模。在C#中,多重继承确实是没有用的。唯一的优点是它消除了将接口方法手动委派给组合成员中的实现的需要。这本可以解决得更好(例如,通过引入mixins),但这不是引入多重继承的充分理由。
Konrad Rudolph 2012年

我已经在Java中使用面向对象的代码进行编码了很多年了(合理地使用继承(有时很多,当我学得更好时会更少)),而我发现只有1次确实很难绕开多重继承,也许是10次我本可以使用它来简化我的当前设计-当我无法重新分配它而不需要多重继承并且使总体设计比以前更好时,恰好是零次。
Bill K

Answers:


14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c很好地涵盖了这个问题。

我对此的看法是:设计师可能想设计一种能够推广良好设计原则的语言。好的,因此有时候多重继承是完美的。但是,这些是例外,而不是规则,很容易被滥用。因此,设计人员决定使其无法执行。

对于那些比较好的情况,您需要使用接口。这些工作虽然很笨拙;但是,您并不需要那么多。


8

只是为了说明为什么不这样做,C ++支持多重继承,但是强烈建议不要使用多重继承,因为您可以使用MI的组合来完成大多数工作,但是使用的方式要简洁得多。与C ++不同,C#不是“混合”类型的OOP语言,即它不是从以前的语言演变而来的。

如果确实需要多重继承,则可以实现多个接口。


6

沃尔特·布赖特(Walter Bright)既是不包括MI的D的创建者,也是唯一一个亲自编写整个C ++编译器的人。据他说,D缺乏MI的原因是创建一个同时高效,简单且有用的MI系统太难了。我怀疑Java和C#使用类似的推理。诸如Perl和Python之类的语言并不以效率为主要目标,因此它们的系统既简单又有用,但难以高效实现。C ++似乎并不是以简单性为目标,因此C ++创建了一个几乎没人能理解的庞大复杂的系统。

我认为Walter是正确的目标。如果存在某种语言,其MI系统能够很好地满足这三个条件,请发表评论。


2
您如何看待Eiffel,Common Lisp和Dylan?我知道这三个都既简单又有用。而且我知道Common Lisp和Dylan在性能上都可以与C ++(甚至常常是C)竞争甚至击败,因此这似乎可以满足效率要求。我确实知道Eiffel 编译器的运行速度非常慢,但是我几乎不了解它产生的编译代码的性能。
约尔格W¯¯米塔格


-1

因为语言设计者显然希望产生更好的C ++,而不是一般来说不是更好的语言。(他们的成功程度有待商debate。)

C ++风格的多重继承存在一些问题,因此,从C ++派生的人们通常忽略了它(Java,C#,D)。其他语言,例如Eiffel和Common Lisp,仅举两个例子,它们的用法有所不同,似乎没有相同的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.