我是一個新手斯卡拉所以原諒我,如果這是一個愚蠢的問題,但在這裏不用...擴展內置集合,問題與內置的方法
想象我想創建一個擴展地圖類型包括其他方法。我可以看到幾種方法來做到這一點。第一個將與構圖:
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
}
組成有點尷尬,因爲你經常不得不參考裏面的東西。繼承是一個相當自然的事情,但對我來說卻是一個皺紋(更多在一秒之內)。性狀似乎是一個非常優雅的方式來做到這一點,並使用「與」構造它是非常好的,但它也有我的問題。
我遇到的皺紋是像++這樣的方法。他們返回一張新地圖。因此,讓我們假設上面提到的「我的方法」希望在地圖上添加一些東西(只是一個例子,我知道地圖已經有這個),例如,
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]特性嗎?我想過創建一個新的不可變的地圖,該地圖是預先填充的,然後用「Path [V]」標記,但是沒有這樣的構造函數可以用來創建預填充的地圖。
我懷疑(雖然我還沒有證實它),我會有一個類似的問題,使用繼承。我可以添加一個新的方法來添加一個新的條目到地圖中,但我不會找回我想要的「Path [V]」。構圖方法似乎是唯一的途徑。
我希望這很清楚。註釋?
請參閱http:// stackoverflow。com/questions/3374923/how-can-you-inherit-a-generic-factory-method – 2010-08-12 22:20:35