【问题标题】:Child class method not overriding the method of the same signature in parent子类方法不覆盖父类中相同签名的方法
【发布时间】:2013-05-10 04:25:29
【问题描述】:

为什么我的子类方法没有覆盖其父类中相同签名的方法?

总结:

我有一个类PlayerPaddle,它扩展了一个抽象类Paddle,它扩展了抽象类Actor(这里的上下文是一个乒乓球游戏)。 PaddlePlayerPaddle 都有一个签名相同的方法:

public void moveDown()

目的是让PlayerPaddle moveDown 方法覆盖Paddle 的方法。这里的问题是当我在PlayerPaddle 中调用this.moveDown() 时,只调用了PaddlemoveDown 方法。

详情:

Paddle 中设置在moveDown() 上的断点被触发,而在PlayerPaddlemoveDown() 上的断点永远不会触发。我还在PlayerPaddle moveDown 方法上尝试了@Override,但它仍然调用Paddle moveDown 方法。

上下文:

目标是PlayerPaddle 对象以不同于其他Paddle 对象的速度向上/向下移动。所以moveUp方法也会出现同样的问题。

代码如下:

abstract public class Actor {
    public void releasedEvent(KeyEvent e) {
    }
}

abstract public class Paddle extends Actor {
     public void moveDown() { // this method is called
          body.setVel(0, Game.dX / 10.);   
     }
}


public class PlayerPaddle extends Paddle {
    @Override
    public void moveDown() { // this method never gets called
       body.setVel(0,  Game.dX );
    } 

    public void receiveEvent(KeyEvent e) {
       if (e.getKeyCode() == KeyEvent.VK_UP) {
          this.moveUp(); 
       } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
          this.moveDown(); // Want to call moveDown() inside PlayerPaddle
       }
    }

}

我很乐意提供澄清。

【问题讨论】:

  • 看起来应该可以了。您是如何确定调用了哪个方法的?
  • 尝试记录一条消息(即使是System.out.println() 也可以)。这可能比尝试使用调试器跟踪您的位置更可靠。无论如何对我来说效果更好......
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 在你实际调用方法的地方显示你的代码
  • 如果这不起作用,Java 就不会是多态的。它是什么...

标签: java inheritance


【解决方案1】:

看简单的案例,它有效:

public class Test{

  public static void main(String args[])
  {     
    new PlayerPaddle().receiveEvent();
  }
}
abstract class Actor {
  public void releasedEvent(KeyEvent e) {
  }
}
abstract class Paddle extends Actor {
  public void moveDown() { // this method is called
      System.out.println("paddle");
  }
}
class PlayerPaddle extends Paddle {
  @Override
  public void moveDown() { // this method never gets called
   System.out.println("playerpaddle");
  } 
  public void receiveEvent() {
     this.moveDown(); // Want to call moveDown() inside PlayerPaddle      
  }
}

它调用 PlayerPaddle。

【讨论】:

  • 感谢您的帮助,这是正确的。我把我的班级名字弄混了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多