gpt4 book ai didi

java - 使用 java 继承和接口(interface)调用的方法版本不正确

转载 作者:行者123 更新时间:2023-12-04 05:07:36 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Force invocation of base class method

(6 个回答)


9年前关闭。




我有一个简单的继承层次结构和一个单一的接口(interface)。考虑将由 B 类扩展的 A 类。我希望这两个类都实现接口(interface) I 并且 A 类是抽象的。在java中,我大致有以下内容:

public interface I {
public double foobar();
public void print();
}

public abstract class A implements I {
@Override public double foobar() { /*return foo*/}
@Override public void print() {
System.out.print(foobar());
}
}

public class B extends A {
@Override public double foobar() { /*return bar*/ }
@Override public void print() {
super.print();
System.out.print(foobar);
}
}

我的意图是,当我实例化 B 类型的对象并调用它的 print() 时,让 B 类型的对象首先打印 A 类的 foo,然后打印 B 类的 bar;但是,当我编译执行此代码时,它在两种情况下都从 B 类调用 foobar()。例如,如果 foo 等于 1 并且 bar 等于 2,则上述代码的输出将如下所示:

2
2

但我希望它是
1
2

我尝试过使用各种类型转换调用该方法,但没有运气。有什么建议么?

编辑:感谢您的许多建议,只是为了澄清一下,我希望 A 的每个潜在子类都实现 I 并且我为没有明确说明而道歉。此外,我目前通过在 A privateFooBar() 中添加一个由 A 的 print 和 A 的 foobar 调用的附加方法来获得工作代码;但是,我仍然想知道是否有更优雅的方法来完成这项任务。

最佳答案

foobar()在 B 类中被覆盖。因此,每次在 B 类的实例上调用它时,都会调用该方法的 B 类版本。这就是多态性的全部意义所在。

如果您希望 A 中的 foobar() 方法始终返回 A 的 foobar 版本,并且不希望子类中的方法更改它,foobar()应该制作final在一个。

或者您可以委托(delegate)给 private A中的方法:

public abstract class A implements I {
@Override
public double foobar() {
return privateFoobar();
}

private double privateFoobar() {
/* return foo */
}

@Override public void print() {
System.out.print(privateFoobar());
}
}

public class B extends A {
@Override public double foobar() { /*return bar*/ }
@Override public void print() {
super.print();
System.out.print(foobar());
}
}

关于java - 使用 java 继承和接口(interface)调用的方法版本不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15320331/

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