斯卡拉:限制在子类中的同一小类有序的比较(Scala: Restricting Ordered co

2019-07-30 19:44发布

我想,如下图所示,比较扑克手。 我一直在玩弄不同类型的运营商,但会感兴趣的一些指导。 我的目标是有一个声明了一个抽象父类Ordered (这样它不需要在每个子类中声明),但参数会使得每个子类只能与同一类的实例进行比较。

例如,下面,一个HighCard只能与另一个相比HighCardTwoPair与另一TwoPair

    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) = ...
    }

Answer 1:

˚F-bounded多态性是实现这种事情一个常用的方法:

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) = ...
}

它可能会觉得有点像样板不得不交出自己作为一个类型参数,你扩展的东西,但它是一个非常方便的方式,能够对在父类的子类来具体谈。



文章来源: Scala: Restricting Ordered comparison in subclasses to the same subclass
标签: scala types