1

我想创建一个扩展的Counter[A]数据结构(受 Python 的Counter启发),它只Map[A, Int]记录 type 项的出现次数A。我希望它有 2 个额外的方法add(item: A),以及remove(item: A)与之关联的递增/递减计数器,item当然我还想要所有不错的 Scala 集合方法mapfilter等等,所以我可能应该扩展Map[A, Int]。但是,对于我应该覆盖/实现Map其他 Scala 集合方法以使其简单工作的最小方法集,我感到困惑。

4

2 回答 2

4

考虑用委托代替继承。换句话说,你的类可以扩展Map[A, Int],但它应该包含一个私有Map[A, Int]成员。对您的班级的所有调用只是将相同的调用委托给成员。

这是我的建议的部分实现:

class MyClass[A, Int] extends collection.immutable.Map[A, Int] {
  private val map = collection.immutable.Map.empty[A, Int]

  def get(key: A): Option[Int] = {
    map.get(key)
  }

  def iterator: Iterator[(A, Int)] = {
    map.iterator
  }

  def -(key: A): Map[A, Int] = {
    map - key
  }

  def +[B1 >: Int](kv: (A, B1)): Map[A, B1] = {
    map + kv
  }
}
于 2013-10-26T20:34:31.827 回答
1

你应该看看这个: http ://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html 它详细解释了在 scala 中构建新集合的过程。如果您不想阅读整篇文章,您可以直接跳到“集成新集合和地图”部分,该部分通过示例展示了如何构建新类型的地图——这正是您想要做的。

于 2013-10-26T21:00:04.733 回答