JAVA返回父对象——继承中的继承——Builder模式

标签 java parent-child builder extends return-type

我确信这个问题可能已经得到解答,但环顾四周后,我不确定正确的术语可以给我一个可靠的答案。要么是这个,要么我没有完全理解某些事情。

我正在尝试创建一系列具有不同方法的构建器,但是它们必须全部继承自“基础”构建器。这很好,但我无法让它返回正确的对象来继续构建器模式。

我尝试过的示例:

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");
    }
}

Builder2Builder3 等的原理相同

关于JAVA返回父对象——继承中的继承——Builder模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45424825/

相关文章:

java - 构建器模式验证 - Effective Java

xml - 如何通过调用方法或闭包将节点添加到 Groovy Markup Builder 中的不同父节点

ios - Flash Builder iOS 导出版本错误格式版本标签无效

java - 在 JSTL/JSP 中我什么时候必须使用 <c :out value ="${myVar}"/> and when can I just say ${myVar}

java - eclipse : Crap4j and other intelligent code quality analyzers

c++ - 什么类型的转换从 parent 到 child ?

c - 如何限制子线程或子进程以限制在 C 中 fork

java - clickLongOnScreen(x,y) 和 clickLongOnView(v) 返回 "Injecting to another application requires INJECT_EVENTS permission"

java - 当调用RecyclerView Adapter的 "notifyDataSetChanged() "时,RecyclerView抛出 "java.lang.Throwable: addInArray "

javascript - 如何按类查找子元素的父元素 - Jquery