10

这是场景 - >假设有 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
    }
}
  • 您如何设计 Enemy 类以使其具有执行某些操作但需要每个孩子都覆盖它的方法?
  • 您如何强制孩子(必须重写该方法)也调用父母的方法?

这几乎就像 Activity具有 onCreate、onStart、onResume 等的 Android 类。方法是可选的,但如果你使用它,它会强制你调用 super. 它不能是抽象的,因为我希望在调用方法时运行一些代码(仅在父类的方法中)。如果你知道他们是怎么做到的,你会加分吗?

4

4 回答 4

6

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。如果子类不覆盖该函数,则不会发生任何额外的事情,而如果它们这样做,则覆盖将添加到先前的行为。

于 2013-01-23T08:41:06.907 回答
5

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

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(),并且您知道父母所做的事情每次都会发生

于 2014-04-11T14:13:42.847 回答
-1

您如何设计 Enemy 类以使其具有执行某些操作但需要每个孩子都覆盖它的方法?

为此,您的父类方法需要定义为抽象方法,这是子类知道父类中定义的方法需要在子类中定义的唯一方式。

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

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

于 2013-01-23T08:41:24.920 回答
-3

怎么样

public abstract class Enemy extends GameObject{
    public abstract void updatePositionCommon(){ 
        //code common to all

        updatePosition();
    }
    public abstract void updatePosition(){ 
        //override this method in children
    }

}
于 2013-01-23T08:38:54.660 回答