trait A extends Actor {
private val s = Set[Int]()
override def act() {
loop {
react {
// case code that modifies s
}
}
}
}
trait B extends Actor {
private val t = Set[String]()
override def act() {
loop {
react {
// case code that modifies t
}
}
}
}
val c = new C with A with B //...?
我真正想要的是 B.act() 和 C.act()
的某种自动组合,但对于特征混合,只有 B.act()
将被调用。有没有简单的方法可以实现这一点?
编辑:这是一个 half-solution我已经找到了我说“一半”是因为原始特征不再扩展 Actor
,并且 C with A with B
需要定义为类,而不是动态混合。也许我应该称其为“四分之一解决方案”?
最佳答案
也许您可以创建一个特征,将消息转发到其他 Actor 的列表,这样您就不必修改 A
或 B
:
trait C extends Actor {
private val acts: Seq[Actor] = Seq(new A{}, new B{})
override def act() {
acts foreach (_.start)
loop {
react { case x => acts foreach { _ ! x } }
}
}
}
您当然可以在实例化它时保留 acts
抽象或用不同的集合覆盖它。
关于scala - 多个特质 mixin 和 Actor 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272550/