2012-10-03 44 views
1

我試圖創建一個類,它在功能,但是,我想這是可選的,如果呼叫者留下來時,我希望它有一個默認的功能所取代。在輔助構造函數傳遞的方法

目前,我有以下幾點:

class MenuItem(val text: String, val onClick: (Vector2f) => Unit) extends Renderable { 
    def this(text: String) = this(text, { position =>() }) 

    private def default(position: Vector2f) = { 
    println(text + " was clicked, but is still using the default event.") 
    } 
} 

這工作得很好,但我想default,以取代在構造函數中{ position =>() }),但這樣做的錯誤導致「未找到:默認值」。

我試過沒有私營修改默認的聲明,但這並沒有幫助。

我想出了最好的解決辦法是宣佈這樣的:

def this(text: String) = this(text, position => println(text + " was clicked, but is still using the default event.")) 

有沒有一種方法可以讓我離開定義的默認方法,只是使用它的名字,否則我將不得不堅持實施方法內聯?

回答

4

這應該工作(除去怪異的類型,使之編譯):

object MenuItem { 
    def default(text: String, position: AnyRef) = { 
     println(text + " was clicked, but is still using the default event.") 
    } 
} 

class MenuItem(val text: String, val onClick: (AnyRef) => Unit) { 
    def this(text: String) = this(text, MenuItem.default(text, _)) 
} 

訪問您要構建不起作用,因爲一旦建造它時,才能訪問對象的方法。

Language Specification Section 5.3.1

簽名和一個構造 德音響nition的自構造函數調用被類型檢查並在其中是在 效果在封閉類德音響nition的點的範圍進行評價,增強通過封閉類的任何 類型參數以及封閉模板的任何早期定義 (第5.1.6節)。

'self構造函數調用是對主構造函數的調用。而且由於它是在封閉類的範圍內進行類型檢查的,因此它不會在類中看到方法。

這是一件好事,因爲主構造函數被調用之前,沒有定義實例(text在這種情況下)的字段。