所以,这就是问题所在。假设我有以下代码流程:
public class SomeGrandparent {
private int x;
private int y;
...
public void setX(int x) {setting value of x...}
public void setY(int y) {setting value of y...}
}
public class SomeParent extends SomeGrandparent {
...
public void move() {manipulate object movement via calls to inherited setX and setY}
}
public class SomeChild extends SomeParent {
...
public void setX(int x) {throw exception} //Override method. Child should not be allowed to directly modify X.
public void setY(int y) {throw exception} //Override method. Child should not be allowed to directly modify Y.
}
然后,在程序的后面,我有以下内容:
SomeChild aChild = new SomeChild();
...
aChild.move();
执行时,调用aChild.move()
时会抛出错误。为什么在SomeChild
中,继承的move()
方法正在使用本地重写的setX和setY方法?有没有办法让aChild.move()
调用SomeParent中定义的move()并使用SomeParent中定义的setX和setY?
即使我在SomeChild中明确定义了以下内容,
...
public void move() {
super.move();
}
然后aChild.move()
仍在SomeChild
中使用本地覆盖的setX和setY。这让我疯了。任何帮助表示赞赏。
我能理解的唯一解决方案是从SomeParent的move()
方法中复制所有代码并将其粘贴到SomeChild中,将其对setX和setY的所有引用替换为super.setX和super.setY。但是,这完全违背了继承的目的!
答案 0 :(得分:1)
多态性将选择对象的运行时类型,以便调用setX
和setY
,即使它们是在超类中调用的,也不会覆盖这些方法。
您可以在setX()
中制作方法setY
和final
SomeGrandparent
,以便SomeChild
等子类不能覆盖它们。
答案 1 :(得分:0)
我假设您的代码示例中存在拼写错误并且您正在使用多态性,因此您的真实代码类似于:
SomeGrandparent aChild = new SomeChild();
而不是你说的话:
SomeChild aChild = new SomeChild();
这证明了你的两个问题:
aChild.move()
时出现编译错误,因为move()
中没有SomeGrandparent
setX
的{{1}}和setY
,因为他们的对象的运行时类型是按照rgettman的回答解释的