gpt4 book ai didi

Java 继承不符合预期

转载 作者:行者123 更新时间:2023-11-29 10:10:40 25 4
gpt4 key购买 nike

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

我有 3 个具有以下签名的类:

abstract class A {}
class B extends A {}
class C extends A {}

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

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");
}
}

最后是我的主要内容:

public static void main(String... args) {
C mod = new C();
MyClass myClass = new MyClass(mod);
myClass.doSomething();
}

现在是问题; execute(C) 方法永远不会被执行,它始终是 execute(A) 方法。我该如何解决这个问题?我无法将 execute(A) 方法的签名更改为 execute(B),因为这会在 MyClass#doSomething 处出现错误,提示 java“无法解析方法 execute(A)”。

最佳答案

方法重载在编译时解决。在编译时,m 的类型是A,所以execute(A m) 被执行。

此外,私有(private)方法不可覆盖。

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

关于Java 继承不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com