如果子类在本地覆盖其中某些子类时,如何强制它使用父类?

时间:2015-02-27 23:42:14

标签: java inheritance setter override

所以,这就是问题所在。假设我有以下代码流程:

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。但是,这完全违背了继承的目的!

2 个答案:

答案 0 :(得分:1)

多态性将选择对象的运行时类型,以便调用setXsetY,即使它们是在超类中调用的,也不会覆盖这些方法。

您可以在setX()中制作方法setYfinal SomeGrandparent,以便SomeChild等子类不能覆盖它们。

答案 1 :(得分:0)

我假设您的代码示例中存在拼写错误并且您正在使用多态性,因此您的真实代码类似于:

SomeGrandparent aChild = new SomeChild();

而不是你说的话:

SomeChild aChild = new SomeChild();

这证明了你的两个问题:

  • 调用aChild.move()时出现编译错误,因为move()中没有SomeGrandparent
  • 您正在使用setX的{​​{1}}和setY,因为他们的对象的运行时类型是按照rgettman的回答解释的