2017-02-01 25 views
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) 

我可以寫我這樣普通的功能,最具體的方法將被調用?如果沒有,圖書館是否會發生一些輕微變化?最後,這個圖書館使用的模式是否有名字?很難找到關於名字不知道的模式的信息。

回答

1

您可以編寫將基類型作爲傳遞參數的泛型函數,但如果您需要該類型的成員方法,則必須確定派生類型。

def f(b:B) = b match { 
    case s:S => s.foo 
    case _ => b.foo 
} 
f(new S) // res0: Int = 54 

P.S.唉,我不知道這個模式是否有名字。