2016-07-15 36 views
0

我的情況類似,這個問題有點:使用可堆疊特性與單獨的對象

Can the stackable trait pattern be used with singleton objects?

但小的差異。我有什麼可以簡化爲以下形式:

abstract class Pr { 
    def pr() 
} 

trait PrePostPr extends Pr { 
    var NUMERIC_VAR: Int = _ 
    abstract override def pr() { 
    NUMERIC_VAR = 5 // number is being extracted eg. from conf file 
    super.pr() 
    } 
} 

現在我真的想有一個單獨的對象,將檢查的常數,取決於它會採取的方式如下一些進一步的行動:

class ImplPr extends Pr with PrePostPr { 
    def pr() = if(NUMERIC_VAR > 5) println("Foo") else println("Bar") 
} 

object Foo extends ImplPr 
Foo.pr() 

可惜的是,上面的代碼不編譯 - 我得到:

方式PR需要'覆蓋」修飾符

是否有任何解決方法使此解決方案有效?

+1

我不認爲這是理論上可行。爲了讓'Foo.pr'訪問'NUMERIC_VAR',它必須在'PrePostPr'的子類中實現,這意味着它永遠不會被稱爲'super.pr()'in 'PrePostPr.pr()'。您可能必須將'NUMERIC_VAR'移到不同的類/特徵。 – devkat

回答

2

如果移動NUMERIC_VAR到不同的特點它的工作:

trait NumericVarHolder { 
    var NUMERIC_VAR: Int = _ 
    } 

    abstract class Pr { 
    def pr() 
    } 

    trait PrePostPr extends Pr { 
    self: NumericVarHolder => 
    abstract override def pr() { 
     NUMERIC_VAR = 5 // number is being extracted eg. from conf file 
     super.pr() 
    } 
    } 

    class ImplPr extends Pr with NumericVarHolder { 
    def pr() = if(NUMERIC_VAR > 5) println("Foo") else println("Bar") 
    } 

    object Foo extends ImplPr