2014-11-05 39 views
0

我有,我希望擴展類,它由名稱參數在它的構造函數的情況下:擴展一個類時服用的父類的構造函數使用儲值一個通過名字參數

class Extension(something: Something) 
    extends Base(something.doSomething(something.getSomething(false)) 

class Base(expression: => Result) { 
    ... 
} 

但是,致電something.getSomething(false)會導致副作用,因此無法多次調用。

我怎麼能存儲something.getSomething(false)結果,將它傳遞給父類的構造函數之前?一個既考慮參數和生成的參數,和一個只需要參數,用戶應該提供 -

+0

的代碼需要重新設計,這樣的突變和繼承避免;這通常提供更好,更容易與實現一起工作。 – 2014-11-05 12:59:42

+0

@ErikAllik在這種情況下,它不是突變,而是因爲它涉及文件存取 - 呼叫只能在文件的開頭,這不再是這種情況處決後。但是,在這種情況下避免繼承可能是一個很好的建議。無論哪種方式,我覺得這應該是可能的,而且是。 – 2014-11-05 13:03:49

+0

文件訪問*爲*突變:),你可以很容易地解決,通過移動IO位核心邏輯之外,或者通過使用緩存,或一些其他手段。 – 2014-11-05 13:06:26

回答

0

我們可以有兩個構造做到這一點。

我們做的第一個構造函數私有的,所以人們不小心使用它,那麼我們就用第二個構造函數構造值,並將其傳遞到第一。

class Extension private (something: Something, generatedFromSomething: Generated) 
    extends Base(something.doSomething(generatedFromSomething) { 
    def this(something: Something) = this(something, something.getSomething(false)) 
} 

由於ErikAllik suggests in the comments,它可能是最好的,如果可以簡單地避免繼承,因爲它變得微不足道做到這一點的話外:

def extended(something: Something) = { 
    val generatedFromSomething = something.getSomething(false) 
    new Base(something.doSomething(generatedFromSomething) 
} 
相關問題