Java - 绕过多态?

时间:2013-07-30 22:21:38

标签: java polymorphism

假设我有一个这样的课程:

public class Base
{

    public void foo()
    {
        System.out.println("base foo");
    }

    public Base()
    {
        foo();
    }
}

我有一个像这样的派生类:

public class Derived extends Base
{
    public void foo()
    {
        System.out.println("derived foo");
    }
}

由于多态性,当我创建派生类的实例时,当基本构造函数被隐式调用时,基本构造函数将调用派生方法foo而不是基本foo。有没有办法“强制”基础构造函数调用自己的foo?

1 个答案:

答案 0 :(得分:9)

  

有没有办法“强制”基础构造函数调用它自己的foo?

否(假设您希望能够覆盖foo中的Derived情况,其中调用虚拟方法当你从子类调用super.whatever()时,将不会以多态方式执行 - 即使子类重写它也会调用超类实现。这对你的情况没有用,因为你想在相同的类中调用实现。

但是你可以使用template method pattern的变体(它不一样,但它让人想起它......)来获得你想要的效果

public class Base
{
    public void foo()
    {
        fooImpl();
    }

    private void fooImpl()
    {
        System.out.println("base foo");
    }

    public Base()
    {
        fooImpl();
    }
}

现在foo()本身就像往常一样是多态的 - 但如果(在Base中)你想要执行“foo()如果没有被覆盖将会做什么”你可以只调用{{1} }。