0

スーパーメソッドが、この参照を独自の型ではなくスーパー型として渡す必要があるのはなぜですか?

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

4

1 に答える 1

0

あなたの質問は不明です。オブジェクトのインスタンスで関数が呼び出されると、親の型として参照されている場合でも、子のメソッドが呼び出されます。ポリモーフィズム。子がメソッドをオーバーライドしない場合、メソッドの親クラスの実装が呼び出されます。階層からの継承。

クラスが自身のメソッドに super をプレフィックスとして付けて呼び出すと、署名に一致する階層内で最も近い実装が検索されます。

于 2013-09-17T20:20:39.823 に答える