这是场景 - >想象有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
}
}
这几乎就像Android的Activity
类,它具有onCreate,onStart,onResume等。可选的方法,但如果你使用它,它会强制你调用super。它不能是抽象的,因为我想在调用方法时运行一些代码(仅在父类的方法中)。如果你知道他们是怎么做的话,可以获得奖励积分吗?
答案 0 :(得分:5)
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
。如果子类没有覆盖该函数,那么就不会发生任何额外的事情,而如果它们发生了,则覆盖将添加到先前的行为。
答案 1 :(得分:4)
也许您可以在类
中定义基本方法,而不是调用子方法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()并且你知道父母每次都会发生的事情
答案 2 :(得分:-1)
你如何设计敌人类,以便它有一个方法 什么,但要求每个孩子都要覆盖它?
为此,需要将父类方法定义为抽象方法,这只是子类知道父类中定义的方法需要在子类中定义的方式。
你如何强迫孩子(必须重写方法) 调用父方法?
如果父类是抽象类,则覆盖方法。
答案 3 :(得分:-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
}
}