Different languages actually have different expectations for how MI
工作。例如,如何冲突是
解决和是否重复的基础
合并或多余。在我们可以之前
在 CLR 中实现 MI,我们必须
所有语言、图形的调查
找出共同的概念,然后决定
如何表达它们
语言中立的态度。我们也会
必须决定 MI 是否属于
CLS 以及它的意义
不想要这个概念的语言
(例如,可能是 VB.NET)
当然,这就是我们的工作
作为一个通用语言运行库,但是我们
没时间为军情六处做这些
yet.
管理信息学真正适用的地方实际上相当多
小。在许多情况下,多个
interface inheritance can get the job
在其他情况下,你可
能够使用封装和
如果我们要增加一个
有点不同的结构
混音器,那会不会更多
强大
多个实现继承将大量复杂性注入到
这种复杂性
影响铸造,布局,调度,
field access, serialization, identity
比较,可核实性,
反射,泛型,可能还有
很多其他地方
省略多个
从 Java 语言继承
mostly stem from the "simple, object
oriented, and familiar" goal. As a
简单的语言,Java 的创造者
想要一种大多数开发人员
不需要广泛的掌握
为此,他们努力工作
使该语言与 C + + 类似
可能的(熟悉的)没有携带
C + + 不必要的复杂性
(简单)。
在设计师看来,有很多
遗传会导致更多的问题
比解决困惑还要困惑,所以他们停止了
语言的多重继承
(正如他们切断操作员
overloading). The designers' extensive
C + + 的经验告诉他们
多重继承不值得
头痛。
回到过去(70年代) ,当计算机科学更多的是科学而不是大规模生产的时候,程序员有时间去思考好的设计和好的实现,因此产品(程序)有高质量(例如:。TCP/IP 协议的设计和实现)。
如今,当每个人都在编程,管理者在截止日期前改变规格时,像维基百科链接中描述的 Steve Haigh post 那样的微妙问题很难跟踪,因此,“多重继承”受到编译器设计的限制。如果你喜欢它,你仍然可以使用 C + + ... 。拥有你想要的一切自由:)
更不用说在 Java 中完全可以使用接口、组合和委托来进行 MI。它比 C + + 更加明确,因此使用起来更加笨拙,但是会让你一眼就能看懂。
There is no right answer here. There are different answers, and which one is better for a given situation depends on applications and individual preference.
多重继承的钻石问题。
We have two classes B and C inheriting from A. Assume that B and C are overriding an inherited method and they provide their own implementation. Now D inherits from both B and C doing multiple inheritance. D should inherit that overridden method, jvm can't able to decide which overridden method will be used?
So what ever java developers feel difficult and complicated to understand for programmers, they tried to avoid it. One such kind of property is multiple inheritance.
他们回避指示
他们避开了多重继承。
多重继承问题: Diamond 问题。
Example:
假设类 A 有一个 fun ()方法。类 B 和类 C 派生自类 A。
类 B 和类 C 都覆盖方法 fun ()。
现在假设类 D 同时继承类 B 和类 C (只是假设)
Create object for class D.
新 D () ;
然后尝试访问 d.fun () ; = > 它会调用 B 类的 fun ()还是 C 类的 fun () ?
This is the ambiguity existing in diamond problem.
Actually multiple inheritance will arise a the complexity if the inherited classes have same function. ie the compiler will have a confusion which one has to chose (diamond problem). So in Java that complexity removed and gave interface to get the functionality like multiple inheritance gave. We can use interface
假设有两个超类 A 和 B,它们具有相同的方法名,但是功能不同。通过下面的代码(扩展)关键字多重继承是不可能的。
public class A
{
void display()
{
System.out.println("Hello 'A' ");
}
}
public class B
{
void display()
{
System.out.println("Hello 'B' ");
}
}
public class C extends A, B // which is not possible in java
{
public static void main(String args[])
{
C object = new C();
object.display(); // Here there is confusion,which display() to call, method from A class or B class
}
}
But through interfaces, with (implements) keyword multiple inheritance is possible.
interface A
{
// display()
}
interface B
{
//display()
}
class C implements A,B
{
//main()
C object = new C();
(A)object.display(); // call A's display
(B)object.display(); //call B's display
}
}
class A {
protected:
bool flag;
};
class B : public A {};
class C : public A {};
class D : public B, public C {
public:
void setFlag( bool nflag ){
flag = nflag; // ambiguous
}
};
在这个例子中,flag数据成员由 class A定义,但是 class D从 class B继承
和 class C,它们都来源于 A,所以本质上 flag的 两份是可用的,因为有两个
A的实例位于 D的类层次结构中。您想设置哪个? 编译器会报警
在 D中对 flag的引用是 模棱两可。一个修正是明确地消除引用的歧义:
B::flag = nflag;
另一个修复方法是将 B 和 C 声明为 virtual base classes,这意味着只有 A 的一个副本可以
存在于等级制度中,消除了任何歧义。