查看好的示例Polymorphism vs Overriding vs Overloading,请考虑以下情况:
abstract class Human {
public void goPee() {
println("drop pants");
}
}
class Male extends Human {
public void goPee() {
super.goPee();
println("stand up");
}
}
class Female extends Human {
public void goPee() {
super.goPee();
println("sit down");
}
}
我的问题:
在具体的课程级别,使用goPee()中的super.goPee()是否可以强制执行?如果是这样 - 怎么样?
在抽象类级别,是否有可能知道哪个具体类调用了super.goPee()?基本原理是,如果我需要在抽象类级别调用方法,请说liftToiletSeat()
。
谢谢。
答案 0 :(得分:2)
您可以通过使用简单的Template Method Pattern来为子类做出选择来强制执行它。在想要强制拨打super
的超类中,请不要做出选择。
制作方法final
,使其无法覆盖,然后调用必须覆盖的abstract protected
方法。强制执行超类行为。
abstract class Human {
public final void goPee() {
System.out.println("drop pants");
toStandOrNotToStand();
}
protected abstract void toStandOrNotToStand();
}
然后子类可以覆盖超类方法,因此它不能决定不调用super
,但它必须覆盖抽象方法才能具体
class Male extends Human {
@Override
protected void toStandOrNotToStand() {
println("stand up");
}
}
并且Female
可以类似地完成。
可以使用getClass()
方法了解具体类,但在超类中执行特定于子类的行为是没有意义的。您应该能够在liftToiletSeat
子类中拥有Male
。