我试图创建不同类型的构建器,每种构建器都有共同和独特的方法,因此我试图为它创建某种抽象,但是我遇到了一个问题。
我的代码示例如下:
// The abstract with all the common methods
public abstract class AbstractBuilder {
public AbstractBuilder commonMethod() {
// implementation here
return this;
}
}
// Builder 1
public class MainBuilder extends AbstractBuilder {
public MainBuilder mainUniqueMethod() {
// implementation here
return this;
}
}
// Builder 2
public class SecondBuilder extends AbstractBuilder {
public SecondBuilder secondUniqueMethod() {
// implementation here
return this;
}
}
这个问题会在与建设者合作时出现,假设我是这样做的
new MainBuilder().mainUniqueMethod().commonMethod(); // Possible
new MainBuilder().commonMethod().mainUniqueMethod(); // Impossible because commonMethod returns `AbstractBuilder`
因此,我发现解决此问题的唯一方法是始终重写,然后对main方法强制执行超级调用,如:
@Override
public MainBuilder commonMethod() {
return (MainBuilder) super.commonMethod();
}
但是如果常用的方法足够大的话,这可能会变得非常重复,也许这是一个糟糕的设计,但是我想知道是否有更有效的方法来实现这一点。
1条答案
按热度按时间mi7gmzs61#
您可以在这里使用泛型:
这样公共基类就可以“知道”实际返回的子类型。这个
getThis()
方法需要一个丑陋的演员阵容,如果你使用类似class SecondBuilder extends AbstractBuilder<MainBuilder>
因此发出警告。所以要注意如何实现子类。解决这个问题的一个方法是
getThis()
抽象并让每个子类实现它。