2011-01-25 27 views
1

我想在實現Modifier中包含實型不可變的Solution對象,但找不到避免downcast的方法。我怎樣才能獨立於解決方案類型編寫Listener而不使它們具有類型參數?如何從執行其轉換的不可變值類型中抽象出來?

以下代碼說明,如果Listener不知道解決方案的具體類型,則downcasts是無法解除的。

trait Solution {} //Immutable abstact class 
trait Listener(val modifier: Modifier) { 
    def onChange(iSolution: Solution): Solution 
} 
trait Modifier { //Implementations use different descendants of Solution 
    def addListener(listener: Listener) 
    def emptySolution: Solution 
    def transfrom1(iSolution: Solution): Solution //Downcast of argument can’t be avoided in implementations of these 
    def transfrom2(iSolution: Solution): Solution 
} 
class Listener1 extends Listener { //Should be independent from Solution concrete type. Current implentation meets this requirement by introducing downcasts in Modifier. 
    val modifier: Modifier 
    def onChange(iSolution: Solution) = modifier.transform1(modifier.transform2(iSolution)) // Some action involving solution transformations with modifier 
} 

回答

4

一個可能的答案已經在你的問題 - 你可以使用抽象類型。

下面是一個例子,可以幫助你:

trait Solution {} 
trait Listener { 
    val modifier: Modifier 
    def onChange(iSolution: modifier.solType): modifier.solType 
} 
trait Modifier { 
    type solType <: Solution 
    def addListener(listener: Listener) 
    def emptySolution: Solution 
    def transform1(iSolution: solType): solType 
    def transform2(iSolution: solType): solType 
} 
trait Listener1 extends Listener { 
    val modifier: Modifier 
    def onChange(iSolution: modifier.solType) = modifier.transform1(modifier.transform2(iSolution)) 
} 
+0

你Listener1取決於類型的改性劑。你必須告訴你的監聽器在構造上的類型基本上相當於有一個類型參數。 – Basilevs 2011-01-27 08:47:14

相關問題