Java继承的行为不符合预期

Pie*_*rcq 1 java inheritance

需要以下上下文:这种编码方式的目的是避免if- else语句和instanceof; 这总是一个坏主意.

我有3个类,有以下签名:

abstract class A {}
class B extends A {}
class C extends A {}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个具有以下结构的类:

class MyClass {
    private final A model;

    public MyClass(A m) {
        this.model = m;
    }

    public void doSomething() {
        System.out.println(this.model instanceof C); //TRUE!!
        execute(this.model);
    }

    private void execute(A m) {
        System.out.println("noo");
    }

    private void execute(C m) {
        System.out.println("yay");
    }
}
Run Code Online (Sandbox Code Playgroud)

最后我的主要内容:

public static void main(String... args) {
    C mod = new C();
    MyClass myClass = new MyClass(mod);
    myClass.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

现在问题; execute(C)方法永远不会被执行,它总是执行(A)方法.我怎么解决这个问题?我无法更改执行(A)方法的签名以执行(B),因为这会在MyClass#doSomething中给出一个错误,指出java"无法解析方法execute(A)".

use*_*421 5

方法重载在编译时解决.在编译时,类型mA,所以execute(A m)执行.

此外,私有方法不可覆盖.

解决方案是使用@OliverCharlesworth建议的访客模式.