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

是的,这就是双重分派的工作方式,您必须像这样覆盖每个子类中的接受方法:

    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 回答