2016-03-15 21 views
0

以下的可堆疊的特點[1]典型的例子:如何堆疊模式,在Scala中,應用時,你需要更多的參數

trait Double extends IntQueue { 
    abstract override def put(x: Int) { super.put(2 * x) } 
} 

,如果我想要不斷的「2」被dymically設置?

我有兩個解決方案,但有相當大的缺點:

  1. Add方法putMultiplied新特點MultiplyX

    trait Multiplier extends IntQueue { 
        abstract override def putMultiplied(constant: Int, x: Int) { super.put(constant * x) } 
    } 
    

    然而,這破壞了可堆疊屬性,因爲另一個可堆疊特性必須知道putMultiplied方法

  2. 給常量設置一個setter:

    trait Multiplier extends IntQueue { 
        var constant //hihi a variable constant 
        abstract override def put(x: Int) { super.put(constant * x) } 
    } 
    

    但是,這看起來很奇怪,並且讓調用者在每次調用之前記得設置constant

憑直覺我希望性狀有一個構造函數的參數:

trait Multiplier(val constant: Int) extends IntQueue { 
     abstract override def put(x: Int) { super.put(constant * x) } 
    } 

但很可惜,我們都知道性狀不支持的參數。

我是否過多地要求將這種模式與Scala特性結合使用? 這將如何解決?

[1] http://www.artima.com/scalazine/articles/stackable_trait_pattern.html

回答

1

讓它另一種方法:

trait Multiplied extends IntQueue { 
     def multiplier = 2 
     abstract override def put(x: Int) { super.put(multiplier * x) } 
    } 

然後,您可以實例化它是這樣的:

val triplingQueue = new ActualQueue with Multiplier { 
     override def multiplier = 3 
    } 
相關問題