我是一个 Scala 新手,如果这是一个愚蠢的问题,请原谅我,但是这里有......
想象一下,我希望创建一个包含附加方法的扩展 Map 类型。我可以看到一些方法来做到这一点。第一个是组合:
class Path[V](val m: Map[V, Int]) {
// Define my methods
}
另一个是通过继承,例如
class Path[V] extends Map[V, Int] {
// Define my methods
}
最后,我还考虑了“特质”路线,例如
trait Path[V] extends Map[V, Int] {
// Define my methods
}
构图有点尴尬,因为你必须经常引用里面的东西。继承是相当自然的,但对我来说有一个皱纹(稍后会更多)。Traits 似乎是一种非常优雅的方法,使用“with”结构非常好,但对我来说也有问题。
我遇到的问题是使用 ++ 之类的方法。他们返回一张新地图。所以假设上面提到的“我的方法”希望在地图上添加一些东西(只是一个例子,我知道地图已经有了这个),例如
trait Path[V] extends Map[V,Int] {
def addOne(v: V, i: Int): Path[V] = this + (v -> i)
}
这会产生错误,因为返回类型不是 Path[V]。现在我知道我可以在新实例上使用“with”来添加 Path[V] 特征。但我不控制这里新地图的构建。有没有办法添加 Path[V] 特征?我考虑过创建一个预先填充的新不可变地图,然后在“with Path[V]”上进行标记,但是没有这样的构造函数可以用来创建预先填充的地图。
我怀疑(尽管我还没有确认)使用继承我会遇到类似的问题。我可以添加一个新方法来向地图添加一个新条目,但我不会得到我想要的“路径 [V]”。组合的方法似乎是去这里的唯一途径。
我希望这很清楚。评论?