我知道Java和C#中不允许多重继承。许多书只是说,不允许多重继承。但是可以通过使用接口来实现。没有任何关于为什么不允许它的讨论。谁能确切告诉我为什么不允许这样做?
简短的答案是:因为语言设计师决定不这样做。
基本上,.NET和Java设计器似乎都不允许多重继承,因为他们认为添加MI会增加语言的复杂性,而带来的好处却很少。
要获得更有趣和深入的阅读,Web上提供了一些文章,并对一些语言设计师进行了采访。例如,对于.NET,克里斯·布鲁姆(Chris Brumme)(曾在CLR的MS上工作)解释了他们决定不这样做的原因:
实际上,对于MI的工作方式,不同的语言有不同的期望。例如,如何解决冲突以及重复的碱基是合并的还是冗余的。在CLR中实现MI之前,我们必须对所有语言进行调查,弄清楚常见的概念,并决定如何以与语言无关的方式来表达它们。我们还必须确定MI是否属于CLS,以及对于不希望使用此概念的语言(例如,大概是VB.NET)意味着什么。当然,这是我们作为公共语言运行时所从事的业务,但是我们还没有为MI做这件事。
实际上,真正适合使用MI的地方数量很少。在许多情况下,多接口继承可以代替工作。在其他情况下,你可能可以使用封装和委派。如果我们要添加一个稍微不同的结构(如mixin),实际上会更强大吗?
多重实现继承为实现注入了很多复杂性。这种复杂性会影响投射,布局,调度,现场访问,序列化,身份比较,可验证性,反射,泛型以及可能还有许多其他地方。
忽略Java语言的多重继承的原因主要来自“简单,面向对象和熟悉的”目标。作为一种简单的语言,Java的创建者想要一种大多数开发人员无需大量培训即可掌握的语言。为此,他们努力使该语言尽可能地类似于C (熟悉),而又不承担C 不必要的复杂性(简单)。
在设计人员看来,多重继承会带来更多的问题和混乱,而这并不能解决。因此,他们削减了语言的多重继承(就像削减了运算符的重载一样)。设计师丰富的C ++经验告诉他们,多重继承根本不值得头疼。
为什么google c/c++风格不允许在多重声明中使用 & 或 * 如上
问题内容: Java不允许多重继承,但是它允许实现多个接口。为什么? 问题答案: 因为接口只指定什么类是做,而不是如何它是做什么的。 多重继承的问题在于,两个类可能定义不同的方式来做同一件事,而子类无法选择该选择哪一个。
在Java中,不允许多重继承,但是在Java8之后,接口可以有默认方法(可以实现方法本身),就像抽象类一样。在此上下文中,还应该允许it多重继承。
问题内容: 我想知道为什么它是Java不允许超负荷使用,虽然他们都以不同的方式使用? 使用方式如下: 而另一种形式: 使用方式如下: 这背后有什么原因吗? 问题答案: 这个15.12.2.5选择最具体的方法对此进行了讨论,但是它相当复杂。例如,在Foo(数字…整数)和Foo(整数…整数)之间进行选择 为了向后兼容,这些实际上是同一件事。 例如,您可以将main()定义为 一种使它们与众不同的方法是
问题内容: 我读了这个问题,并认为如果可以写的话,很容易解决(不是没有它就不能解决): 我不确定在很多情况下它是否有用,但是我想知道为什么它没有用,以及其他语言中是否存在类似的东西。 你们有什么感想? 编辑: 澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。这不是我期望的工作,并且惊讶于出现编译器错误。我只是有这个主意,喜欢讨论它。 问题答案: 它违反了封装。你不应该能够绕过父
问题内容: 我从编译器收到的错误是“分配的左侧必须是变量”。我的用例是深度复制,但并没有实际意义。 在C ++中,可以分配给。 问题不在于如何规避对的分配。这很简单,但是决定不进行变量的背后是什么原理。 原因是技术上的还是概念上的? 到目前为止,我的猜测-用随机方法重建对象的可能性容易出错(概念上),但在技术上是可行的。 编辑 请避免使用“因为Java规范这么说”的变体。我想知道 这个决定 的 原