给这篇Dr Dobbs文章,特别是Builder Pattern,我们如何处理子类化Builder的情况?以我们想要子类化添加GMO标签的示例的简化版本为例,一个简单的实现将是:
public class NutritionFacts {
private final int calories;
public static class Builder {
private int calories = 0;
public Builder() {}
public Builder calories(int val) { calories = val; return this; }
public NutritionFacts build() { return new NutritionFacts(this); }
}
protected NutritionFacts(Builder builder) {
calories = builder.calories;
}
}
Run Code Online (Sandbox Code Playgroud)
子类:
public class GMOFacts extends NutritionFacts {
private final boolean hasGMO;
public static class Builder extends NutritionFacts.Builder {
private boolean hasGMO = false;
public Builder() …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 a 类扩展到 aX。所以,我也扩展了 aBuilder。但是,虽然我能够使用以下方法创建类 a 的对象:
aBuilder f = new aBuilder();
f.bi = i;
f.bs = s;
a atry = f.withI(i).withS(s).build();
Run Code Online (Sandbox Code Playgroud)
这同样不适用于 aX。当我尝试这样做时:
aXBuilder fb = new aXBuilder();
aX aXtry = fb.withI(i).withS(s).withB(b).build();
Run Code Online (Sandbox Code Playgroud)
我收到错误消息(对于 a.aBuilder 类型,未定义 withB(Boolean) 方法)。我应该为 aX 重写所有内容,而不是简单地添加新内容吗?我不想这样做,因为这会导致我的代码中有很多重复。类 a 和 aX 如下所示:
class a {
protected String s;
protected int i;
public void getdata() {
System.out.println(this.s);
System.out.println(this.i);
}
protected a(aBuilder fb) {
this.s = fb.bs;
this.i = fb.bi;
}
public static class aBuilder {
public aBuilder() {
} …Run Code Online (Sandbox Code Playgroud)