1

このフォームに似たクラスをアクターする必要があります。

class ActorSupervisorOne(prop: Prop) extends Actor {
  val dbSuper = context.actorOf(prop)
  val subActor = context.actorOf(Props(new SubActorClass(dbSuper) with **SomeHandlersOne**))

  def receive = {
    case msg =>
      subActor forward msg
  }
}

class ActorSupervisorTwo(prop: Prop) extends Actor {
  val dbSuper = context.actorOf(prop)
  val subActor = context.actorOf(Props(new SubActorClass(dbSuper) with **SomeHandlersTwo**))

  def receive = {
    case msg =>
      subActor forward msg
  }
}

混合特性におけるそれらの唯一の違い。型パラメーターまたは抽象型メンバーで抽象化しても機能しません。次の解決策を試しましたが、見栄えが悪く、コードの重複がまだあります。

abstract class Super extends Actor {
  _: {
    val handler: Props
  } =>

  lazy val actor = context.actorOf(handler)

  def receive = {
    case msg =>
      actor forward msg
  }

}

class ActorSupervisorOne(val dbSuper: ActorRef) extends Super {
  val handler = Props(new SubActorClass(dbSuper) with SomeHandlersOne)
  actor
}

class ActorSupervisorTwo(val dbSuper: ActorRef) extends Super {
  val handler = Props(new SubActorClass(dbSuper) with SomeHandlersTwo)
  actor
}

しかし、この場合、正しく初期化するために呼び出すactor必要があります。そうしないと、機能しません。これを減らすことができる他の解決策はありますか?

4

3 に答える 3

2

おそらくリフレクションを使用してSomeHandlersXYZ実行時に選択できますが、リフレクションに頼りたくない場合は、少なくともサブアクターのインスタンス化コードを複製せずに目的を達成する方法はないと思います (この回答を参照)説明のために私のものです)。基本的にファクトリ関数を渡す場合、次の方法 (スケッチ) でそれを行うことができます。

class ActorSupervisor(prop: Prop, getSubActor: Actor => SubActorClass) extends Actor {
  val dbSuper = context.actorOf(prop)
  val subActor = context.actorOf(Props(getSubActor(dbSuper)))

  def receive = {
    case msg =>
      subActor forward msg
  }
}

val asOne = new ActorSupervisor(..., a => new SubActorClass(a) with SomeHandlersOne)
val asTwo = new ActorSupervisor(..., a => new SubActorClass(a) with SomeHandlersTwo)
于 2013-06-27T08:02:53.647 に答える
0

このソリューションはどうですか:

class ActorSupervisor(subActor: => Actor) extends Actor {
  val actor = context.actorOf(Props(statsProps))
  def receive = {
    case msg =>
      actor forward msg
  }
}

その後、Malte Schwerhoffのように、次のように新しいアクターを作成できます。

val first = new ActorSupervisor(new SubActorClass(...) with SomeHandlersOne)

マクロを使えばより洗練された組み合わせができると思いますが苦手です

于 2013-06-27T08:51:05.957 に答える