Java:make子类只能与同一个子类相媲美

时间:2014-01-04 09:47:06

标签: java subclass comparable

我有一个抽象的Dice类,并且有一些具体的子类,如SixFacesDice,TwentyFacesDice等......我希望每个Dice对象都可以与其他对象进行比较,但前提是它只有相同的子类(例如,SixFacesDice可以'与TwentyFacesDice进行比较)但我不会为每个子类实现Comparable。

我看到的唯一方法是使用Dice类实现Comparable并检查对象是否属于同一个类,否则返回0.但是这个方法根本不优雅...是否有一些方法或设计模式来解决这个问题?

2 个答案:

答案 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