假设我有一个这样的课程:
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?
答案 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} }。