5

是否存在与 Scala 中使用的 ADT 模式的子类型化 OO 概念等价的概念?特别是我想为更专业的类型添加方法。例如,给定一个通用列表 ADT:

sealed trait List[+A]
case class Cons[+A](h: A, t: List[A]) extends List[A]
case object Nil[Nothing]

我想为特定类型的列表定义新方法:

sealed trait List[+A]
sealed trait DuckList extends List[Duck] {
    def feed(l: DuckList) = ...
}

但是我还必须为这些新类型定义特殊的数据构造函数(DuckCons,DuckNil),并且由于案例类不支持(逐个案例)继承,因此无法将 DuckCons 与泛型相关联缺点是它可以在模式匹配中工作,因此为 List 定义的通用方法不适用于 DuckList。

4

1 回答 1

10

使用类型类模式。

例如,考虑如何Ordering实现。它向一组封闭类添加了一个方法——compare但它不是通过直接添加该方法,而是为该特定类提供一个具有这种方法的实例。Ordering[Int],继续这个例子,是这样实现的:

trait IntOrdering extends Ordering[Int] {
  def compare(x: Int, y: Int) =
    if (x < y) -1
    else if (x == y) 0
    else 1
}
implicit object Int extends IntOrdering

也就是说,对象Ordering.Int(因为 this 在 object 内部Ordering)实现了一个compare以两个Int为参数的方法。该对象是隐式提供的,因此用户不需要显式传递它。Listsorted方法利用了这一点:

def sorted[B >: A](implicit ord: math.Ordering[B]): List[A]

然后它可以调用ord.compare列表的实例来对它们进行排序。我鼓励您查看Ordering以了解它在做什么。

于 2013-11-05T04:09:08.630 回答