2014-10-28 80 views
1

在Scala中是有可能在基類聲明泛型抽象函數,然後 提供各種派生類不同的具體實施方式是這樣的:部分定義

abstract class B { 

    def foo[T,V](u:T):V 
} 

class D extends B { 

    def foo(u:T_0) = {...} 
    def foo(u:T_1) = {...} 
    .... 
} 

,同樣也指類D1 ,D2,...從類B(具有可能不同的具體類型T_j) 到類D_j以便使用obj.foo(u)和編譯器標誌,只要foo用於某個類型的參數,而foo不是定義。

總之,問題是:是否從B派生的類被視爲混凝土,只要foo被定義爲 至少有一個具體類型T?

回答

2

在你的例子中,你不能在D範圍內專用UT,你必須匹配來自基類的參數。您也不能在子類中提供個別特殊情況下的重寫,例如部分函數 - 具體類必須爲每個抽象方法提供實現,並覆蓋所有參數。

在我看來,像你真正想要的是在類級別類型參數,對B本身,使派生類專業的參數,然後它們繼承相應地變得專業的foo方法的接口。所以,你想要做的事,如:

abstract class B[T, V] { 
    def foo(u: T): V 
} 

class D extends B[String, Int] { 
    def foo(u: String): Int = u.length 
} 

(您也可以發現它有用添加註解方差class B[-T, +V],但這是另一個故事。)

+0

確定。謝謝。這很不幸。 – 2014-10-28 13:23:01

+0

爲什麼不幸?以這種方式使用類型系統的整個想法是能夠對方法調用的有效性進行嚴格的編譯時檢查。取決於你想要完成什麼,可能有其他更精細的方法。有各種各樣的方法可以將'foo'中的類型關聯起來。我想你可能不得不問一個新的,更具體的問題來獲得幫助。 – acjay 2014-10-28 15:25:52