スーパーメソッドが、この参照を独自の型ではなくスーパー型として渡す必要があるのはなぜですか?
この動作の実用性がわかりません。クラスに対してではなく、型/インターフェイスに対してコーディングすることを学びましたが、この種の動作を考えると、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は -Typeとして参照されますが、それでもオーバーライドされたメソッドが呼び出される
ため、これは本当に厄介です。ac
A
C
visit()