2

假设我有这样的课程:

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?

4

1 回答 1

9

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

否(假设您希望能够覆盖fooin Derived唯一不会多态地执行对虚拟方法的调用的情况是当您super.whatever()从子类调用时 - 即使子类覆盖它,它也会调用超类实现。这在您的情况下没有用,因为您想在同一个类中调用实现。

但是,您可以使用模板方法模式的变体(它不一样,但让人想起它......)来获得您想要的效果。

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

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

    public Base()
    {
        fooImpl();
    }
}

现在foo()它本身是正常的多态 - 但是如果(在 Base 内)你想要执行“foo()如果它没有被覆盖会做什么”,你可以调用fooImpl().

于 2013-07-30T22:23:28.163 回答