覆盖节拍超载?为什么这有意义呢?

时间:2013-09-17 20:07:17

标签: java oop types overloading

为什么超级方法将引用分发为超类型而非自有类型?

我不明白这种行为的实用性。我学会了对类型/接口进行编码而不是对类进行编码,但考虑到这种行为,我对我认为OOP所代表的一切感到困惑。这打破了清洁代码的可能性,迫使我用大量的控制流来填充它,就像大量使用 instanceof 运算符一样。 为什么这种行为甚至有意义?

摘要:
请考虑以下代码:

abstract class A {
    public void visit(Target t) {
         t.method(this);
    }
}

如果Target在其签名中使用A和不同的A类子类重载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);

}

}

输出 A A C C
由于ac被引用为A,因此实际上很不方便 - 类型但仍调用C的覆盖visit()方法。

1 个答案:

答案 0 :(得分:0)

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

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