我确信这个问题可能已经得到解答,但环顾四周后,我不确定正确的术语可以给我一个可靠的答案。要么是这个,要么我没有完全理解某些事情。
我正在尝试创建一系列具有不同方法的构建器,但是它们必须全部继承自“基础”构建器。这很好,但我无法让它返回正确的对象来继续构建器模式。
我尝试过的示例:
public class Builder1 {
protected String string = new String();
public <T extends Builder1 > T append1(String string) {
this.string += string;
return (T)this;
}
public void print() {
System.out.println(this.string);
}
}
public class Builder2 extends Builder1 {
public <T extends builder2 > T append2(String string) {
this.string += string;
return (T)this;
}
}
public class Builder3 extends Builder2 {
public <T extends Builder3 > T append3(String string) {
this.string += string;
return (T)this;
}
}
所以,如果我这样做:
new Builder3().append3("")...
我可以访问 Builder3、Builder2 和 Builder1 中的所有方法 - 太棒了。
当我访问 Builder1 或 Builder2 中的方法之一时,会出现此问题,如下所示:
new Builder3().append1("")...
现在,我只能访问 Builder1 的方法,而无法访问 Builder2 或 Builder3。
正如我所说,我确信这个问题已经在其他地方得到了回答,所以请随时向我指出有关它的任何帖子。
对此的任何帮助将不胜感激,谢谢。
编辑:
我还应该指出,这些方法都会做不同的事情。我的例子让人觉得他们在不同的地方做着同样的事情。
最佳答案
[免责声明:未经测试的代码]
我会做一个定义基本 append*
方法的抽象基类。 ABC 看起来像......
public abstract class BaseBuilder {
protected String string = "";
public void print() {
System.out.println(this.string);
}
abstract <T extends BaseBuilder> T append1(String string);
abstract <T extends BaseBuilder> T append2(String string);
abstract <T extends BaseBuilder> T append3(String string);
}
然后,对于 Builder1
,您可以实现 append1(..)
,并为其他的抛出异常。
public class Builder1 extends BaseBuilder {
public <T extends Builder1> T append1(String string) {
this.string += string;
return (T)this;
}
public <T extends Builder1> T append2(String string) {
throw new UnsupportedOperationException("something");
}
public <T extends Builder1> T append3(String string) {
throw new UnsupportedOperationException("something");
}
}
Builder2
、Builder3
等的原理相同
关于JAVA返回父对象——继承中的继承——Builder模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45424825/