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
这真的很尴尬,因为ac被称为-TypeA但仍然调用了C覆盖的visit()方法。

4

1 回答 1

0

你的问题不清楚。当在对象的实例上调用函数时,将调用子方法,即使它被引用为其父类型;多态性。如果子类没有覆盖该方法,则将调用该方法的父类的实现;从层次结构继承。

如果一个类调用它自己的方法,并在其前面加上 super 前缀,它将找到与签名匹配的层次结构中最近的实现。

于 2013-09-17T20:20:39.823 回答