Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 多重继承批评 我正在研究多重继承的概念(自从我在愤怒中编码C++以来,已经有将近10年了,而且仅仅是学术上对这个概念感兴趣)。我在维基百科上找到了这个_Oop_Multiple Inheritance - Fatal编程技术网

Oop 多重继承批评 我正在研究多重继承的概念(自从我在愤怒中编码C++以来,已经有将近10年了,而且仅仅是学术上对这个概念感兴趣)。我在维基百科上找到了这个

Oop 多重继承批评 我正在研究多重继承的概念(自从我在愤怒中编码C++以来,已经有将近10年了,而且仅仅是学术上对这个概念感兴趣)。我在维基百科上找到了这个,oop,multiple-inheritance,Oop,Multiple Inheritance,对MI列表的一个批评是“不能从单个类显式继承多次”。我对这句话感到困惑,也不是100%确定这是指什么 当然,类继承描述了一个类的结构,从同一个类继承多次只会重申同一个类契约,所以我看不出它会给批评带来什么好处。显式继承会假定类函数和属性有多个实例吗 我想理解这篇批评的含义,以及它为什么对多继承的语言是不可利用的。 < P>类似的,我已经在5年的时间里没有转换C++,而是转换成C语言。我真的不记得我是否经常使用多重继承,但我并不怀念它,特别是因为我可以编写接口代码,而且我现在更多地使用组合 然而,

对MI列表的一个批评是“不能从单个类显式继承多次”。我对这句话感到困惑,也不是100%确定这是指什么

当然,类继承描述了一个类的结构,从同一个类继承多次只会重申同一个类契约,所以我看不出它会给批评带来什么好处。显式继承会假定类函数和属性有多个实例吗


我想理解这篇批评的含义,以及它为什么对多继承的语言是不可利用的。

< P>类似的,我已经在5年的时间里没有转换C++,而是转换成C语言。我真的不记得我是否经常使用多重继承,但我并不怀念它,特别是因为我可以编写接口代码,而且我现在更多地使用组合


然而,在-可能;)-Betrand Meyer为多重继承做了很好的辩护。他也做了类似的辩护。

我想他们的意思是一辆普通车不能从它的四个轮子继承(例如继承四倍于普通轮子)。(参见同一维基百科页面上的C++节)< /P> 然而,我认为这种“省略”实际上是一个积极的特征,因为继承是用来表达子类型的,而不存在“单一类型的多个子类型”。这个“显式多重继承”将不比简单的组合好。

实际上,C++中的一个类可以从同一个类继承多次:

A类{}

B类:公共A()

C类:公共A()

clsss D:公共B,公共C{}


现在D用两个拷贝A。这通常被认为是“坏主意”,C++提供虚拟继承来控制它。

< P>我想问题是关于那个特定的维基百科文章。它包含不止一个尴尬或模糊的陈述,如以下珠宝:

Tcl允许多个父类—它们的序列号会影响类成员的名称解析

但是,这六种语言允许类从多个接口继承,从而在避免其他问题的同时重新创建所提到的一些问题

坦率地说,我不知道你问题中的这句话的作者意图是什么。这只是一篇写得不好的文章中含糊不清的另一个例子,IMHO。

这被称为。大多数允许MI的现代语言都有一个解决方案

简而言之,您有这样一个类树:

class A { public int f = 0; };

class B extends A { f = 1; };

class C extends A { f = 2; };

class D extends B, C {};

D.f.会打印什么?如果你在D.f中输入一些值,它应该存储在哪里?这两个字段B(A).f和C(A).f应该合并为一个字段,还是保持分开?如果在B和C中重写a的方法x,D.x()应该做什么?两个都打?按哪个顺序?返回值呢?

多重继承是面向对象编程的目标。它的出现是因为早期OOP语言(C++等)所采用的方法。它在右手中运行良好,但在其他大多数情况下会让人困惑

OOP的主要目标之一是行为的重用。这原来是一种幻想。在某些情况下很有用,但在其他情况下,我们真正感兴趣的是定义对象如何交互。看看设计模式中有多少模式使用接口而不是继承

实现接口,然后进行显式聚合,是执行多重继承所做相同操作的更清晰、更易于维护的方法。几乎所有的OOP都有定义接口的方法,几乎所有的OOP都可以将对象聚合在一起。然而,OOP以微妙的不同方式处理多重继承(菱形问题等)引起的问题。就像GOTO一样,当您使用多个iheritance查看代码时,不清楚发生了什么。然而,就像GOTO一样,它在不同的情况下也很有用


对我来说,使用任何困难的语言结构的首要考虑因素是我是否必须长期维护应用程序。如果我这样做了,那么我会选择最清晰、更容易维护的方法,即使现在需要更多的编程。和其他事情一样,这是一个判断的决定。请注意,大多数时候,我们都会坚持我们开发的程序,时间比我们想象的要长得多

不,不是这个。“钻石继承”在维基百科链接页面上被列为一个单独的问题。这也是我的想法,因此我感到困惑。我同意将其作为“功能”包含是错误的,因为这肯定违背了我对OO的理解“类车不能从它的四个轮子继承(例如,继承四倍于类轮子)”好吧,它可以,只是不能直接。有趣的想法。
goto
实际上是一个有用的工具。没有理由禁止
goto
。或者任何避免MI的理由。