为什么一个超级方法应该把它的这个引用作为超级类型而不是自己的类型来分发?
我不明白这种行为的实用性。我学会了针对类型/接口而不是针对类进行编码,但是考虑到这种行为,我对我认为 OOP 所代表的一切感到困惑。这打破了干净代码的可能性,并迫使我用冗长的控制流来填充它,比如大量使用instanceof运算符。为什么这种行为甚至有意义?
摘要:
考虑这段代码:
abstract class A {
public void visit(Target t) {
t.method(this);
}
}
如果在其签名中使用 A 和 A 的不同子类Target
重载method()
,并且这些子类没有覆盖visit(Target t)
自己,则method(A a)
编译器将始终选择重载。
工作示例: http: //pastebin.com/EGNpY7pF
代码片段
public class Target {
public static abstract class A {
void visit(Target t) {
t.method(this);
}
}
public static class B extends A {}
public static class C extends A {
@Override
void visit(Target t) {
t.method(this);
}
}
void method(A a) { System.out.println("A");}
void method(B b) { System.out.println("B");}
void method(C c) { System.out.println("C");}
public static void main(String[] args) {
Target t = new Target();
A ab = new B();
B b = new B();
A ac = new C();
C c = new C();
ab.visit(t);
b.visit(t);
ac.visit(t);
c.visit(t);
}
}
输出
AACC
这真的很尴尬,因为ac
被称为-TypeA
但仍然调用了C
覆盖的visit()
方法。