scala - 多个特质 mixin 和 Actor 的问题

标签 scala inheritance actor mixins traits

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 的列表,这样您就不必修改 AB:

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/

相关文章:

python - 在Python中确定一个合适的子类来存储特定类型的数据

python - 从具有多重继承的类中检索参数

scala - 在scala中的另一个线程上执行一个简单的任务

scala - 为什么 Scala 中的模式匹配不适用于变量?

scala - 在 Scala 中正确编码这种存在类型?

java - 在公共(public)抽象方法的所有子类中提取公共(public)实现的最佳方法

scala - Akka 日志记录模式不可更改

Scala,调用 `map(f)` 与 `map(v => f(v))` 时的不同行为

scala - SBT:编译器接口(interface)构建后会去哪里?

scala不喜欢akka中的自变量?