2

スーパークラスがあるとします。thisそのスーパー クラスでは、それ自体のランタイム オブジェクト ( ) をパラメーターとしてオーバーロードされたメソッドに渡します。トリックは、このオーバーロードされたメソッドがサブクラス タイプによってオーバーロードされることです。あなたがそれをしようとすると、あなたは得るでしょう

メソッド ... は適用できません (実引数 ... はメソッド呼び出し変換で ... に変換できません)

代わりに、(正しいランタイム クラスを取得するためだけに) サブタイプごとにメソッドを個別に実装する必要があります。これは、メソッドの内容が同一である場合、多くの重複作業になります。

例えば:

public class InferTypeTest {

    public static void main(String[] args) {
        SubClass1 s1 = new SubClass1();
        s1.sayHi();
    }

    public static void sayHi(SubClass1 clz) {
        System.out.println("clz 1");
    }

    private abstract static class SuperClass{
        public void sayHi() {
            InferTypeTest.sayHi(this);
        }
    }

    private static class SubClass1 extends SuperClass{

    }

}
4

2 に答える 2

2

はい、これが二重ディスパッチの仕組みです。次のように、各サブクラスで accept メソッドをオーバーライドする必要があります。

    private static abstract class NodeWithChildren implements DomNode {
        /* snip */
        public void accept(DomNodeVisitor visitor) {
            for (DomNode child : children) {
                child.accept(visitor);
            }
        }
    }

    private static class BodyNode extends NodeWithChildren {
        public void accept(DomNodeVisitor visitor) {
            visitor.visit(this);
            super.accept(visitor);
            visitor.visited(this);
        }
    }

    private static class DivNode extends NodeWithChildren {
        public void accept(DomNodeVisitor visitor) {
            visitor.visit(this);
            super.accept(visitor);
            visitor.visited(this);
        }
    }
}
于 2012-06-02T19:52:56.120 に答える
0

BodyNode は NodeWithChildren です DivNode は NodeWithChidren です NodeWithChildren は DomNode です DomPrinterVisitor は DomNodeVisitor DomNodeVisitor の訪問者は「BodyNode」または「DivNode にアクセスできますが、「NodeWithChildren」を渡して訪問します。ここで BodyNode は NodeWithChildren ですが、NodeWithChildren は BodyNode/ ではありません

Theary is if B extends A, you can say B is a A/ not A is a B.
于 2012-06-02T20:13:44.713 に答える