【发布时间】:2020-06-01 13:22:49
【问题描述】:
我正在尝试通过继承实现 Builder 模式,并找到了以下 solution 。
这是B类:
public class B extends A {
public static abstract class Builder<T extends Builder<T>>
extends A.Builder<T> {
@Override
public abstract T getThis();
public Builder Bmethod() {
//implementation
return this;
}
public B build() {
return new B(this);
}
}
private B(Builder builder) {
super(builder);
//B field assignment
}
}
现在我想让 C 类也可扩展。我就是这样做的:
public class C extends B {
...
public static class Builder<T extends Builder<T>> extends B.Builder<T> {
....
}
}
所以,在C 中,我们有可以扩展的构建器,例如D。我的问题是创建 C.Builder 实例的正确方法是什么。我的意思是,我应该在它的泛型中设置什么:
C.Builder<WHAT HERE> builder = new C.Builder<>();
【问题讨论】:
-
B长什么样子? -
只是一个模糊的想法,但我会将
C设计为可扩展(因此具有与B相同的抽象构建器)或不可扩展(因此具有创建C实例的具体构建器)。混合具体类和继承虽然可能总是有问题并且可能令人讨厌。 -
只是我在原始文章中看到的术语歧义。 Builder 是一个允许您构建复杂事物的类。喜欢: var builder = new SQLBuilder(); builder.addTable("员工"); builder.addJoin("工资", "id","id_employee"); builder.addWhere(SQLWhere.equals("id", 6));字符串查询 = builder.build();构建器模式不需要链接调用的能力,但可以使其更具表现力。
-
使用静态导入它可能看起来像:select("Employees").innerJoin("Salaries", eq("id","id_employees").where(eq("id",6) ).build()
-
C.Builder<?>工作..
标签: java generics design-patterns