1

我正在尝试比较扑克手,如下所示。我一直在玩不同类型的运算符,但会对一些指导感兴趣。我的目标是拥有一个声明的抽象父类Ordered(这样就不需要在每个子类上声明它),但是参数化将使得每个子类只能与同一类的实例进行比较。

例如,在下面, aHighCard只能与 another HighCardTwoPair与 anotherTwoPair等进行比较。

    sealed abstract class HandValue(rank: Int) extends Ordered[?]
    case class HighCard(high: Int) extends HandValue(0){
        def compare(that: HighCard) = ...
    }
    case class TwoPair(high: Int, big: Int, sm: Int) extends HandValue(2) {
        def compare(that: TwoPair) = ...
    }
4

1 回答 1

3

F -bounded polymorphism是完成这种事情的一种常用方法:

sealed abstract class HandValue[A <: HandValue[A]](rank: Int) extends Ordered[A]

case class HighCard(high: Int) extends HandValue[HighCard](0){
    def compare(that: HighCard) = ...
}

case class TwoPair(high: Int, big: Int, sm: Int) extends HandValue[TwoPair](2) {
    def compare(that: TwoPair) = ...
}

不得不将自己作为类型参数交给您要扩展的东西可能感觉有点像样板,但这是一种非常方便的方式,可以专门讨论父类中的子类类型。

于 2012-08-05T21:19:32.950 回答