Android – 如何强制子代覆盖有代码的父代方法

这里的情况 – >想象有3个类,我想做一些类似的:

public class GameObject { public void updateBounds() { // do something } } public abstract class Enemy extends GameObject { public abstract void updatePosition(){ //<-- this will not compile, //but this is what i want to do, to force //child to override parent method updateBounds(); } } public class Minion extends Enemy { @Override public void updatePosition() { super.updatePosition(); // <-- how do i throw an exception if this line // is not called within this method of the // child? // now do something extra that only Minion knows how to do } } 
  • 你怎么devise敌人级别,以便它有一个方法,做一些事情,但要求每个孩子都覆盖它?
  • 你如何强迫孩子(谁必须重写该方法)也调用父母的方法?

这几乎就像Android的Activity类,它有onCreate,onStart,onResume等等。 方法是可选的,但如果你使用它,它会强制你调用super。 它不能是抽象的,因为我想要一些代码在调用方法时运行(只在父类的方法中)。 如果你知道他们如何做到这一点,奖励积分?

Android Sources使用一个名为mCalled的布尔值,在准抽象方法实现中设置为true。 在你的情况下,将在原来的updatePosition()

然后当你想调用updatePosition() ,通过这个来调用它:

 private void performUpdatePosition() { mCalled = false; updatePosition(); if (!mCalled) throw new SuperNotCalledException(); } 

updatePosition()将如下所示

 protected void updatePosition() { mCalled = true; updateBounds(); } 

编辑:

现在我想到了,android的方式是一个小圆圈。 由于所有对updatePosition()调用都是通过performUpdatePosition() ,所以不再需要在updatePosition()内部有一些可以覆盖的代码,但是不应该有。

更好的方法是简单地将所需的操作移动到执行performUpdatePosition()

 private void performUpdatePosition() { updateBounds(); updatePosition(); } protected void updatePosition() { //Do nothing by default } 

这样被调用者不必担心调用super.updatePosition 。 如果子类不覆盖该函数,则不会发生任何额外的事件,而如果这样做,则覆盖将添加到以前的行为。

也许不是你调用子方法,你可以在类中定义一个基本方法

 public void updatePosition() { //do what you need to do before the child does it's stuff onUpdatePosition(); //do what you need to do after the child does it's stuff } protected abstract void onUpdatePosition(); 

这样,当你调用updatePosition()时,孩子必须拥有它自己的onUpdatePosition(),并且你知道父母每次都会发生的事情

你怎么devise敌人级别,以便它有一个方法,做一些事情,但要求每个孩子都覆盖它?

要做到这一点,你的父类方法需要被定义为抽象方法,这是只有子类才知道在父类中定义的方法需要在子类中定义的方法。

你如何强迫孩子(谁必须重写该方法)也调用父母的方法?

如果父类是抽象类,则覆盖方法。

怎么样

 public abstract class Enemy extends GameObject{ public abstract void updatePositionCommon(){ //code common to all updatePosition(); } public abstract void updatePosition(){ //override this method in children } }