2013-08-27 12 views
10

私はActorを拡張する複数の形質を作り出しています。次に、これらの特性のいくつかを使用するアクタークラスを作成したいと思います。しかし、私はどのようにActorクラスのreceiveメソッド内のすべての特性から受信メソッドを組み合わせるか分からない。アクターに複数の形質を積み重ねる

トレイト:

trait ServerLocatorTrait extends Actor { 
    def receive() = { 
     case "s" => println("I'm server ") 
    } 
    } 

    trait ServiceRegistrationTrait extends Actor { 
    def receive() = { 
     case "r" => println("I'm registration ") 
    } 
    } 

俳優:

class FinalActor extends Actor with ServiceRegistrationTrait with ServerLocatorTrait { 
    override def receive = { 
    super.receive orElse ??? <--- what to put here 
    } 
} 

は今、私はFinalActor"r""s"を送信する場合にのみServerLocatorTraitに行く - 最後の形質が追加されます。 だから、これが今の仕組みは、この場合にそうServerLocatorTrait

質問、それはスーパー最後の形質が追加考慮することである:
はどのように私はFinalActor内のすべての特性からメソッドを受け取る兼ね備えていますか?

PS - 私はreact例で役者を見てきました:http://www.kotancode.com/2011/07/19/traits-multiple-inheritance-and-actors-in-scala/ をそれはそれはにスーパーのスーパーを呼び出す伴うだろうので、私は、あなたが受け取る方法を組み合わせることができるかどうかわからないんだけど、私は

+0

[アッカの俳優とScalaのスタッカブル形質パターン]の可能な重複を/ question/18124643/scala-stackable-trait-pattern-with-akka-actors) – cmbaxter

+0

@cmbaxterそれはそれがどのように重複しているのかわかりません。多分OPは私が解決策として選んだものを使うことができるかもしれませんが。 – Adrian

答えて

17

必要なものではありませんServiceRegistrationreceiveメソッドを取得します。それはまた非常に混乱するでしょう。

別の方法は、形質のreceiveメソッドに異なる名前を付けることです。

trait ServerLocatorTrait extends Actor { 
    def handleLocation: Receive = { 
    case "s" => println("I'm server ") 
    } 
} 

trait ServiceRegistrationTrait extends Actor { 
    def handleRegistration: Receive = { 
    case "r" => println("I'm registration ") 
    } 
} 

class FinalActor extends Actor with ServiceRegistrationTrait with ServerLocatorTrait { 
    def receive = handleLocation orElse handleRegistration 
} 

object Main extends App { 

    val sys = ActorSystem() 

    val actor = sys.actorOf(Props(new FinalActor)) 

    actor ! "s" 
    actor ! "r" 

    sys.shutdown() 

} 

は、あなたはまだあなたの最初のアプローチを使用できますが、それぞれの混合形質の連鎖super.receive必要があります。

trait IgnoreAll extends Actor { 
    def receive: Receive = Map() 
} 

trait ServerLocatorTrait extends Actor { 
    abstract override def receive = ({ 
    case "s" => println("I'm server ") 
    }: Receive) orElse super.receive 
} 

trait ServiceRegistrationTrait extends Actor { 
    abstract override def receive = ({ 
    case "r" => println("I'm registration ") 
    }: Receive) orElse super.receive 
} 

class FinalActor extends IgnoreAll with ServiceRegistrationTrait with ServerLocatorTrait 

後者の解決策は私にはかなり醜いです。

主題についての詳細は下記のリンクを参照してください:http://stackoverflow.com(

Extending Actors using PartialFunction chaining

+0

私はあなたの最初の解決策が好きで、私はそれを使っていると思います(これは何が起こっているのかをより詳しく示しています)。私は最初、あなたの第2の解決策のようなものを探していました。 – Adrian

+0

trait ServerLocatorTrait {this:Actor => ....}、あなた自身の実際のアクターではないので、あなたの特性はtrait ServerLocatorTrait {this:Actor => ....}として宣言できます。この構文では、「この特性は俳優に混じります」と言います。 –

関連する問題