如何解决当多个类继承单个抽象类时使用构建器模式
我正在构建具有两个实体的 Web 应用程序:
- 漫画 - id、title、releaseDate、coverId、流派、作者、卷等
- 漫画卷 - 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 举报,一经查实,本站将立刻删除。