我有一个抽象的Dice类,并且有一些具体的子类,如SixFacesDice,TwentyFacesDice等......我希望每个Dice对象都可以与其他对象进行比较,但前提是它只有相同的子类(例如,SixFacesDice可以'与TwentyFacesDice进行比较)但我不会为每个子类实现Comparable。
我看到的唯一方法是使用Dice类实现Comparable并检查对象是否属于同一个类,否则返回0.但是这个方法根本不优雅...是否有一些方法或设计模式来解决这个问题?
答案 0 :(得分:2)
假设您希望编译时安全而不仅仅是执行时安全,您可以使用泛型,如下所示:
abstract class Dice<T extends Dice> implements Comparable<T> {
int value;
public int compareTo(T other) {
return Integer.compare(value, other.value);
}
}
final class Dice1 extends Dice<Dice1> {
}
final class Dice2 extends Dice<Dice2> {
}
这不会阻止某人像这样滥用它:
class BadDice extends Dice<Dice1>
...但如果使用得当,我认为它可以为您提供所需的行为。
请注意,这仅适用于一个继承级别 - 您将无法干净地拥有Dice<T>
子类的子类,因为那样您的“同一类”强制执行将失败。
如果您对执行时安全性没有问题,那么将this.getClass()
与other.getClass()
进行比较绝对合理。
答案 1 :(得分:2)
优雅与否,比较getClass()
的结果是标准做法。 除之外,你不应该返回0而是抛出ClassCastException
。返回0并不表示“不具有可比性”,而是“相等”,并且该关系具有您无法满足该设计的某些约束,例如 transitivity :
DiceA aLow, aHigh;
DiceB b;
在你的情况下,
aLow.compareTo(b) == b.compareTo(aHigh) == 0
但
aLow.compareTo(aHigh) < 0