当前位置: 首页 > 知识库问答 >
问题:

当多个类继承单个抽象类时使用生成器模式

陆才俊
2023-03-14

我正在用两个实体构建web应用程序:

  1. 漫画-id、标题、发行日期、封面id、流派、作者、卷等

这两个类继承自抽象类书。Book类将为这两个类提供公共变量:id、title、releaseDate、coverID;

我正在使用Pattern Builder创建漫画和体积对象。但当我试图设置描述时,我得到了以下错误:

        Manga manga = (Manga) new Manga.Builder().setID(id)
                                     .setTitle(title)
                                     .setCoverID(id)
                                     .setDescription() //Cannot resolve method 'setDescription' in 'Builder'
                                     .build();

图书类:

公开摘要类书籍

public final Long id;
public final String title;

protected Book(final Builder<T> builder) {
    this.id = builder.id;
    this.title = builder.title;
}

public abstract static class Builder<T> {
    private Long id;
    private String title;

    public Builder<T> setID(Long id) {
        this.id = id;
        return this;
    }

    public Builder<T> setTitle(String title) {
        this.title = title;
        return this;
    }

    public abstract T build();
}

我的漫画课:

public class Manga extends Book<Manga> {

private final String description;

protected Manga(Builder builder) {
    super(builder);
    this.description = builder.description;
}

public static class Builder extends Book.Builder<Manga> {
    
    private String description;

    public Builder setDescription(String description) {
        this.description = description;
        return this;
    }

    @Override
    public Manga build() {
        return new Manga(this);
    }
}

或者有更好的解决方案吗?

谢谢

共有1个答案

上官凯泽
2023-03-14

这应该是可行的:

package de.dwosch;

public abstract class Book {

    public final Long id;
    public final String title;

    protected Book(final Builder<?> builder) {
        this.id = builder.id;
        this.title = builder.title;
    }

    public abstract static class Builder<T extends Builder<T>> {
        private Long id;
        private String title;

        public T id(Long id) {
            this.id = id;
            return me();
        }

        public T title(String title) {
            this.title = title;
            return me();
        }

        public abstract T me();
        public abstract Book build();
    }
}

然后呢

package de.dwosch;

public class Manga extends Book {

    private final String description;

    protected Manga(Builder builder) {
        super(builder);
        this.description = builder.description;
    }

    public static class Builder extends Book.Builder<Builder> {

        private String description;

        public Builder description(String description) {
            this.description = description;
            return this;
        }

        @Override
        public Builder me() {
            return this;
        }

        @Override
        public Manga build() {
            return new Manga(this);
        }
    }
}

用法

    Manga manga = new Manga.Builder().description("test")
            .title("title")
            .build();

我已经多次实现了这个模式。约书亚·布洛赫(Joshua Bloch)在他的书《有效的Java》(great book btw)中写到了这一点。

如果你需要进一步的信息,请告诉我。

顺便说一句:没有set的个人偏好设置方法。看起来更干净:)

 类似资料:
  • 问题内容: 通过使用抽象类,我们可以实现与接口相同的功能,那么为什么Java不允许以下代码? 我知道可以通过仅使用接口来实现多重继承,但是上面的代码与接口所做的事情相同。 问题答案: 不允许这样做,因为您可以对抽象类做更多的事情。允许多重继承是没有意义的,前提是您只在可以使用接口的情况下才使用抽象类。 仅将抽象类用于无法通过接口执行的操作会更简单,在这种情况下,您将无法使用两个抽象父类。 注意:使

  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 我有一个关于JPA中继承的问题,是否可以使用JOINED策略来实现这个层次结构? 这是我的代码: 在上面的层次结构之后,我尝试使用JPQL进行查询,这是查询: 此代码从主代码运行 当我运行该查询时,会抛出以下错误 导致原因:com . MySQL . JDBC . exceptions . JDBC 4 . MySQL syntaxerrorexception:未知列“employee1_。“字段

  • 问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。

  • 问题是: 我有一个叫做Schema的基类,它是抽象的,它是一个未生成的类。我有两个从Schema继承生成的JAXB类:FixedWidthSchema和DelimitedSchema。 我使用外部绑定(xjb)文件来指定XSD和Java类之间的映射。 在基类模式中,我定义了几个方法: 公共架构静态创建(Model m),它从提供的模型创建架构。 公共抽象Writer marshal(),它将当前架