您的课程设计无效。
在行为意义上,硬币和骰子是平等的,但投掷它们的东西却不是。因此,您不能在此处应用继承。这些类应该代表我们世界的抽象。您应该尝试通过其属性而不是外观来分解对象。硬币和骰子确实看起来不同,但行为方式相同。
如果你仔细看看。当您确定称为 Die 的常见事物是建立在为您带来信息的 Faces 之上的结构时,我将指出这一点。但这取决于您如何获得此结果,其中一种方法是掷骰子。投掷过程在逻辑上等同于选择骰子的随机面。因此,最后您可以通过两种方式调用将获得结果的过程。getRandomFace
或throwFace
。ThrowFace 对人类来说更直观,但对于编码器来说可能会产生误导,尤其是在 throw 是关键字的 Java 中。
您需要的第一个类是代表骰子面的类。
public final class Face {
private String displayName;
Face(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return this.displayName;
}
}
因为骰子只不过是一张面孔列表
public final class Die {
private Face[] faces;
public Die(Face[] faces) {
if(faces == null) throw new IllegalArgumentException("Faces must not be null");
if(faces.length < 2) throw new IllegalArgumentException("Die must have at least two faces");
this.faces = faces;
}
public Face getFace(int face) {
return this.faces[face];
}
public int getFaceCount() {
return this.faces.length;
}
}
最后,我们需要一些可以掷骰子的东西来得到脸。我们可以创建一个带有静态方法的 utill 类来支持对 Dice 的不同操作。
public final class DieUtill {
public static final Die COIN = new Die(new Face[] {new Face("head"),new Face("tail")});
public static final Die DICE = new Die(new Face[] {new Face("1"),new Face("2"),new Face("3"),new Face("4"),new Face("5"),new Face("5")});
public static final Face getRandomFace(Die die) {
int face = new Random().nextInt(die.getFaceCount());
return die.getFace(face);
}
}
如果我们需要关于随机值更复杂的逻辑,你应该创建一个像 FaceRandomizer 这样的类,然后在构造函数中传递一个 Dice 并实现随机逻辑。