强制方法重载

时间:2014-05-29 18:31:03

标签: java polymorphism

查看好的示例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");
  }
}

我的问题:

  1. 在具体的课程级别,使用goPee()中的super.goPee()是否可以强制执行?如果是这样 - 怎么样?

  2. 在抽象类级别,是否有可能知道哪个具体类调用了super.goPee()?基本原理是,如果我需要在抽象类级别调用方法,请说liftToiletSeat()

  3. 谢谢。

1 个答案:

答案 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