微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当多个类继承单个抽象类时使用构建器模式

如何解决当多个类继承单个抽象类时使用构建器模式

我正在构建具有两个实体的 Web 应用程序:

  1. 漫画 - id、title、releaseDate、coverId、流派、作者、卷等
  2. 漫画卷 - id、title、releaseDate、coverId、isbn、pages 等

这两个类继承自抽象类Book。 Book 类将具有两个类的公共变量:id、title、releaseDate、coverID;

我正在使用 Pattern Builder 创建 Manga 和 Volume 对象。但是当我尝试 setDescription 时,我收到此错误

{tracks.map((track,index)=> (
   <div className="song-details-artwork queue-next">
     <div className="art">
       <img style={{ width: "100%" }} src={track["image"]} alt="" />
     </div>
     <div onClick={() => {setTrackIndex(index)} className="song-names">
        <div className="queue-song-name">{track["title"]}</div>
        <div className="queue-song-name">{track["artist"]}</div>
     </div>
   </div>))}

图书类:

公共抽象类 Book {

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

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

谢谢。

解决方法

这里应该可以:

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 在他的《Effective Java》一书中对此进行了阐述(顺便说一句,很棒的书)。

如果您需要有关这方面的更多信息,请告诉我。

顺便说一句:个人偏好 - 构建器流程中没有 set 的 setter 方法。看起来“更干净”:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。