类设计建议(使用Java实施) - 枚举 继承



我有一个具有以下类的设计:

public class Book {
  protected BookColorType color;
  public Book (BookColorType color) {
    ...
  }
}
public enum BookColorType {
  BLACK, WHITE
}
public enum ColorBookColorType {
  BLACK, WHITE, RED, BLUE, GREEN
}
public class ColorBook extends Book {
  protected ColorBookColorType color;
  public ColorBook(ColorBookColorType color) {
    // this will cause error has ColorBookColorType is not the same type as BookColorType
  }
}

如何使用Java和更好的班级设计实现上述?关键是书籍应仅与书本颜色书(是一本书)相关联,并且仅与colorbookColortype(黑白重复)相关。

请建议,谢谢。

如果每种类型的Book必须具有自己的颜色Type枚举,则使每个类都有仅需要的颜色类型的知识。
因此,请勿将BookColorType color;Book类中获得继承的字段,而是一个私有字段,并使ColorBook具有其自己的私人颜色类型字段:ColorBookColorType color;

此外,如果从两个枚举类中检索一个值(字符串或常见的枚举值或其他内容)以使它们在某种程度上可以操作是有意义的,那么您可以使它们实现特定的接口。

这是一个想法:

  • 您可以使您的枚举实现一个接口,例如BookColorType
  • 然后,您将把当前的BookColorType枚举重命名为BWBookColorType
  • 之类的东西
  • 您的Book超级类保留构造函数,并将BookColorType对象作为参数
  • 您的ColorBook构造器调用super(...)
  • 如果参数的实际类型不是ColorBookColorType
  • ,则可以扔一个IllegalArgumentException
  • 请注意,您的ColorBook类将没有自己的字段,而是将重复使用Book的字段,该字段将是类型BookColorType(接口的类型)

示例

public class Book {
    protected BookColorType color;
    public Book(BookColorType color) {
    }
}
public interface BookColorType {}
public enum BWBookColorType implements BookColorType {
    BLACK, WHITE
}
public enum ColorBookColorType implements BookColorType {
    BLACK, WHITE, RED, BLUE, GREEN
}
public class ColorBook extends Book {
    public ColorBook(BookColorType color) {
        super(color); // need to be 1st line
        if (!(color instanceof ColorBookColorType)) {
            throw new IllegalArgumentException("Only colored books!");
        }
    }
}

关键是用强大的打字来表达约束,而不是像 instanceof 。。

public interface Book {
  BookColor getColor();
}
public interface BookColor {
}
public enum MonoChrome implements BookColor {
  BLACK, WHITE
}
public enum Colorful implements BookColor {
  RED, BLUE, GREEN
}
public final class ColorBook implements Book {
    private final Color color;
    public ColorBook(final BookColor color) {
      super();
      this.color = Objects.requireNonNull(color);
    }
}
public final class MonoChromeBook implements Book {
    private final Color color;
    public ColorBook(final MonoChrome color) {
      super();
      this.color = Objects.requireNonNull(color);
    }
}

这样, colorbook 可以具有单色和彩色的颜色。单色Bookbook 仅接受单色颜色。

在 @Mena的帖子上构建,我将使用仿制药执行颜色类型:

public interface BookColorType {}
public class Book<C extends BookColorType> {
    protected C color;
    public Book(C color) {
    }
}
public enum BWBookColorType implements BookColorType {
    BLACK, WHITE
}
public enum ColorBookColorType implements BookColorType {
    BLACK, WHITE, RED, BLUE, GREEN
}
public class ColorBook extends Book<ColorBookColorType> {
    public ColorBook(ColorBookColorType color) {
        super(color);
    }
}
public class BWBook extends Book<BWBookColorType> {
    public BWBook(BWBookColorType color) {
        super(color);
    }
}

最新更新