0
對於錯誤的標題感到抱歉。
我正在使用具有此特徵的基礎特徵和多個實現的庫。然而,取代傳統的方法重寫,方法專用化是通過採用隱式參數的方法提供的。一般模式是如下在運行時得到最精確的隱含關係
class Cont[TT](val n : Int)
trait I[ +Self ] {
final def foo[TT >: Self](implicit num : Cont[TT]) = num.n
}
trait B extends I[B]
object B {
implicit def Mint : Cont[B] = new Cont[B](53)
}
class S extends B with I[S]
object S{
implicit def HMint : Cont[S] = new Cont[S](54)
}
B是「基本類型」,其中,你將有幾個亞類(其中S是一個例子)。這個子類中的每一個都會提供一些implicits(就像我們在例子中爲Cont所做的那樣),對於每個想要專門化的方法來說都有一個。如果未定義某個隱式,則使用B中的一個(上面的代碼中未顯示)。你實際上想要在B及其子類上調用的方法在特質I中定義,每種方法都有一種類型。
我的問題是,我想寫泛型函數作爲參數B或其子類的集合,並調用它們的方法,但我想要調用最具體的含義。 問題是,與重寫方法不同,「編譯時」類型定義了將調用哪個方法。例如:
val s = new S
val b : B = s
(b.foo,s.foo)
res50: (Int, Int) = (53,54)
我可以寫我這樣普通的功能,最具體的方法將被調用?如果沒有,圖書館是否會發生一些輕微變化?最後,這個圖書館使用的模式是否有名字?很難找到關於名字不知道的模式的信息。