关于钻石问题的维基百科:
“......钻石问题是当两个类 B 和 C 继承自 A,而类 D 继承自 B 和 C 时出现的歧义。如果 D 中的方法调用 A 中定义的方法(并且不重写该方法) ),并且 B 和 C 以不同的方式重写了该方法,那么它从哪个类继承:B 或 C?”
所以钻石看起来像这样:
A
/ \
B C
\ /
D
我的问题是,如果没有这样的类 A,但 B 和 C 又声明了相同的方法,例如 foo(),会发生什么。这不是同样的问题吗?那么为什么它被称为钻石问题呢?
Example:
class B {
public void foo() {...}
}
class C {
public void foo() {...}
}
class D extends B, C {
}
new D().foo();
这不是同一个问题。
在原始问题中,可以从 A 调用重写方法。在您的问题中,情况不可能如此,因为它不存在。
在钻石问题中,如果类 A 调用方法 Foo,就会发生冲突。通常这没有问题。但在 D 类中,你永远无法知道需要调用 Foo 的哪个实例:
+--------+
| A |
| Foo |
| Bar |
+--------+
/ \
/ \
/ \
+--------+ +--------+
| B | | C |
| Foo | | Foo |
+--------+ +--------+
\ /
\ /
\ /
+--------+
| D |
| |
+--------+
在您的问题中,没有可以调用该方法的共同祖先。在 D 类上,您可以选择两种口味的 Foo,但至少您知道有两种。您可以在两者之间做出选择。
+--------+ +--------+
| B | | C |
| Foo | | Foo |
+--------+ +--------+
\ /
\ /
\ /
+--------+
| D |
| |
+--------+
但是,与往常一样,您不需要多重继承。您可以使用聚合和接口来解决所有这些问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)