当您需要更多参数时,Scala中的可堆叠模式如何应用

时间:2016-03-15 16:18:52

标签: scala design-patterns

遵循可堆叠特征的规范示例[1]:

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

如果我想要常数' 2'不合时宜地设定?

我有两个解决方案,但有很大的缺点:

  1. 将方法putMultiplied添加到新特征MultiplyX

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

    然而,这会破坏stackable属性,因为另一个可堆叠的特征必须知道putMultiplied方法

  2. 为常量设置一个setter:

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

    然而,这看起来很奇怪,并且让调用者的负担在每次调用之前都要记住设置constant

  3. 直观地说,我希望特征具有构造函数参数:

        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 个答案:

答案 0 :(得分: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
   }