假设我需要一些DerivedBuilder
来扩展一些BaseBuilder
。基本构建器有一些方法,如foo
(它返回BaseBuilder
)。派生建筑师有方法bar
。应在方法foo
后调用方法bar
。为了做到这一点,我可以在DerivedBuilder
像这样覆盖foo
方法:Java通用构建器
@Override
public DerivedBuilder foo() {
super.foo();
return this;
}
的问题是,BaseBuilder
有很多像foo
方法,我必须重写他们中的每一个。我不想这样做,所以我尝试使用泛型:
public class BaseBuilder<T extends BaseBuilder> {
...
public T foo() {
...
return (T)this;
}
}
public class DerivedBuilder<T extends DerivedBuilder> extends BaseBuilder<T> {
public T bar() {
...
return (T)this;
}
}
但问题是,我仍然不能写
new DerivedBuilder<DerivedBuilder>()
.foo()
.bar()
即使T
这里是DerivedBuilder
。我可以做什么以避免覆盖很多功能?
有了这个计算策略仿制药,你可以拨打:'新DerivedBuilder()。 FOO()。栏()'。它将首先工作并执行'foo',然后执行'bar'。如果你想调用更多的'BaseBuilder'方法,最后你想调用'DerivedBuilder'方法,那么这是不可能的,因为第二次,方法返回'BaseBuilder'的引用,你不能调用'DerivedBuilder' s方法。 –
@ Sandeep.KI试图执行该操作,编译器抱怨''Bar'没有在'BaseBuilder'中定义,因为那时我执行'.foo().bar()'编译器在执行'foo之后唯一知道'T'的东西'是这个'T'扩展了'BaseBuilder' – PepeHands
请参见[this](http://stackoverflow.com/questions/4217013/how-to-force-derived-class-to-call-super-method-like-android -does)和[this](http://stackoverflow.com/questions/6853638/require-override-of-method-to-call-super)和[this](http://stackoverflow.com/questions/6142460/how-do-i-force-a-polymorphic-call-to-the-super-method)... – user1803551