gpt4 book ai didi

Java:主类中的递归调用子类方法而不是它自己的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:13 28 4
gpt4 key购买 nike

例子:

class MainClass {
public doIt() {
...
else doIt();
}
}

class SubClass extends MainClass {
@Override
public doIt() {
super.doIt();
...
}
}

现在的问题是:

  • 我调用 SubClass.doIt()
  • MainClass.doIt() 被调用
  • MainClass.doIt() 进行递归调用 doIt()
    但是:调用 SubClass.doIt() 而不是 MainClass.doIt()

这是非常奇怪的行为,问题是程序化的!我试图用 this.doIt() 调用递归,但这没有帮助。有人有想法吗?

非常感谢您的回答,这个问题已经解决

最佳答案

这是假定的行为,通过不设置方法 final,这意味着它可以被overriden,所以你必须始终考虑到有人可以这样做。对该方法的调用永远不会保证是对该级别的方法。

不过,您可以通过使用 (protected) final 方法优雅地解决这个问题:

class MainClass {

protected final void innerDoIt () { //final: so no @Override
...
else innerDoIt();
}

public void doIt() {
innerDoIt();
}

}

然后:

class SubClass extends MainClass {

@Override
public doIt() {
super.doIt();
...
}
}

final 确保该方法不能被覆盖。所以在那一刻,你有一个契约(保证)innerDoIt 方法确实是你认为的 innerDoIt 方法。

因此,如果您不希望调用者被覆盖,只需将其对冲到另一个final 方法中。通过使其成为protected,该方法也可以被SubClass调用。

关于Java:主类中的递归调用子类方法而不是它自己的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28614656/

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