也许最简单的方法是使用MapProxy
trait:
import collection._
class Path[V](val self: Map[V, Int]) extends MapProxy[V, Int] {
// without the companion object below
def addOne(v: V, i: Int): Path[V] = new Path(this + (v -> i))
// with the companion object below
def addOne(v: V, i: Int): Path[V] = this + (v -> i)
// other methods
}
// this companion object is not strictly necessary, but is useful:
object Path {
implicit def map2path[V](map: Map[V, Int]): Path[V] = new Path(map)
}
这消除了组合方法的尴尬,让您可以处理Path
就好像它是一个Map
:
scala> new Path(Map("a" -> 1)) + ("b" -> 2)
res1: scala.collection.Map[java.lang.String,Int] = Map((a,1), (b,2))
scala> new Path(Map("a" -> 1)).get("a")
res2: Option[Int] = Some(1)
如果您包含来自的隐式转换Map
to Path
(定义在Path
伴生对象),那么你也可以对待Map
就好像它是一个Path
:
scala> Map("a" -> 1).addOne("b", 2)
res3: Path[java.lang.String] = Map((a,1), (b,2))
有一个类似的SeqProxy
用于添加行为的特征Seq
.
在更一般的情况下,解决方案是使用拉皮条我的图书馆模式 http://scala.sygneca.com/patterns/pimp-my-library. This 相关问题 https://stackoverflow.com/questions/3374923/how-can-you-inherit-a-generic-factory-method有一个例子。