Scala:使用自我类型实现策略模式

时间:2017-02-11 00:03:24

标签: scala types traits mixins

我试图为管理状态的类实现策略模式。策略实现应该可以访问使用这些策略的类的受保护/公共成员,使用策略的类需要访问策略的公共成员。

我已经开始工作了,除非我无法在不创建不同的每个策略的顶级课程的情况下弄清楚如何做到这一点。这是一个例子:

class BranchState(a: String, b: Int) extends ABranchState(a, b) with QueuedStrat

class ABranchState(a: String, b: Int) {
  this: ChainingStrategy =>
    .... lots of impl ....
}

trait ChainingStrategy {
  self: BranchState =>
    ... headers only, no impl ...
}

trait QueuedStrat extends ChainingStrategy {
   self: BranchState =>
    .... impl ....
}

trait AnotherStrat extends ChainingStrategy {
   self: BranchState =>
    .... impl ....
}

这里的问题是如果我想使用AnotherStrat实例化BranchState,我必须创建另一个类。我曾尝试将类型参数添加到BranchState,例如[T <: ChainingStrategy],但这不起作用,因为编译器(正确地)抱怨我必须在ChainingStrategy中实现标头的实现。似乎我需要一些机制来说&#34;某些类型实现了链接策略完全,IE:没有未实现的方法&#34;。

但是,或许这根本不是正确的方式。我怎么能做到这一点?

由于

1 个答案:

答案 0 :(得分:0)

我不认为你想要做的事情在设计方面确实有意义。您正试图将您的策略​​视为状态。但策略不是国家的任何专业化或概括,所以我认为它们不应该有任何继承关系。

此外,在Scala中,不应该需要策略模式,由于语言的功能方面,你可以真正利用Higher-order Functions(我建议你阅读:How Scala killed the Strategy Pattern,艾尔文亚历山大)。

我希望这可以帮到你!