gpt4 book ai didi

java - 从父类返回子类

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:00 24 4
gpt4 key购买 nike

我有一个构建器类,它从大多数方法返回自身以允许菊花链。为了使它与子类一起工作,我希望父方法返回子类的实例,以便子方法可以链接到最后。

public class BaseBuilder<T extends BaseBuilder<T>> {
public T buildSomething() {
doSomeWork();
/* OPTION #1: */ return this; // "Type mismatch: cannot convert from BaseBuilder<T> to T"
/* OPTION #2: */ return T.this; // "Type mismatch: cannot convert from BaseBuilder<T> to T"
/* OPTION #3: */ return (T) this; // "Type safety: Unchecked cast from SqlBuilder<T> to T"
}
}

public class ChildBuilder extends BaseBuilder<ChildBuilder> {}

选项 #1 和 #2 会导致编译错误,选项 #3 会导致警告(尽管可以使用 @SuppressWarnings("unchecked") 抑制警告)。这里有更好的方法吗?我怎样才能安全地将 Basebuilder 转换为 Childbuilder?

最佳答案

声明ChildBuilder extends BaseBuilder<ChildBuilder>不知何故表明代码有味道并且似乎违反了 DRY。在这个例子中 BaseBuilder只能用 ChildBuilder 参数化没有别的,所以它应该是多余的。

我宁愿重新考虑我是否真的想过度构建它,我会尝试将子构建器的所有方法放入 BaseBuilder 中.然后我可以简单地返回 this来自所有支持链接的方法。

如果我仍然认为通过将特定的构建器方法组分离到它们自己的类中我会受益,那么我会优先考虑组合,因为不建议仅为代码重用应用继承。

假设我们有两个子类 BaseBuilder :

class BuilderA extends BaseBuilder<BuilderA> {
BuilderA buildSomethingA() { return this; }
}

class BuilderB extends BaseBuilder<BuilderB> {
BuilderB buildSomethingB() { return this; }
}

如果需要上链怎么办buildSomethingAbuildSomethingB喜欢:

builder.buildSomething().buildSomethingA().buildSomethingB();

如果不将子类方法移动到 BaseBuilder,我们将无法做到这一点;但想象一下还有BuilderC这些方法没有意义,不应从 BaseBuilder 继承.

如果我们仍然将这两个方法移至父类(super class),下一次将其他三个方法移至父类(super class),再下一次……我们最终会得到一个父类(super class),它负责整个层次结构的 90% 的职责,其中包含大量代码,例如:

if ((this instanceof BuilderB) && !flag1 && flag2) {
...
} else if ((this instanceof BuilderC) && flag1 && !flag2 && thing != null) {
...
} else if ...

我更喜欢的解决方案是像这样的 DSL:

builder.buildSomething1().buildSomething2()
.builderA()
.buildSomethingA1().buildSomethingA2()
.end()
.buildSomething3()
.builderB()
.buildSomethingB()
.end();

在这里end()返回 builder实例,以便您可以链接更多它的方法或启动一个新的子构建器。

这样,(子)构建器可以从他们需要的任何东西继承(否则他们必须只扩展 BaseBuilder )并且可以有自己有意义的层次结构或组合。

关于java - 从父类返回子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com