繁体   English   中英

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

[英]Scala: Using self types to implement a strategy pattern

我正在尝试为我管理状态的类实施策略模式。 策略的实现应有权访问使用那些策略的类的受保护的/公共成员,而使用策略的类需要访问策略的公共成员。

我已经完成了这项工作,除了我不能真正弄清楚如何在不为每个策略创建不同的顶层类的情况下做到这一点。 这是一个例子:

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实例化一个AnotherStrat ,我必须创建另一个类。 我试图向[T <: ChainingStrategy]添加一个类型参数,但这不起作用,因为编译器(正确地)抱怨我必须在ChainingStrategy为标头实现。 似乎我需要某种机制来说“某种类型的类型完全实现了链接策略,即IE:没有未实现的方法”。

不过,也许这根本不是正确的方法。 我该怎么做?

谢谢

我认为您在设计上所做的事情没有任何意义。 您试图将自己的策略当作状态来对待。 但是策略不是国家的任何专门化或概括 ,因此我认为它们不应该具有任何继承关系。

此外,在Scala中,由于该语言的功能方面,不应该需要策略模式,您可以真正利用高阶函数 (我建议您阅读: Scala如何杀死了Strategy Pattern ,Alvin Alexander) 。

我希望这可以帮助你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM