2013-01-09 10 views
6

ここではAkkaアクターライブラリを使用しています。アクターライブラリは、さまざまなメッセージを処理するために "アクター"を拡張するアクターが実装する必要がある部分的な関数 "receive"を定義します。私は "clockActor"という特性がActorを拡張し、 "MasterClock"と "SubClock"が "clockActor"を拡張する私のアプリケーションのための特性階層を作成しています。私は時計の共通機能を "clock"特性の受信機能に追加するつもりですが、マスター機能とサブクロック特性の受信機能に追加機能を追加する方法はありますか?スカラで部分的に実装された部分関数を拡張する

要するに、部分的な関数に余分なcase文を追加する方法が必要です。 アイデア?頭に浮かぶ

+2

を使用してPartialFunctionsを構成することができ、提案http://www.scala-lang.org/api/current/index .html#scala.PartialFunction)。それはトリックをするだろうか? – 4e6

+0

本当にありません。 akkaライブラリは内部的にreceiveを呼び出すことですべてのメッセージを処理しますので、その呼び出しにorElseを追加することはできません。実際には – Alex

+0

はい、orElseは私が必要とするものを正確に行います。卑猥なグーグルで、最初の結果だけを選ぶだけで、見た目が違うようになりましたが、今は動作しています。 – Alex

答えて

11

としては、すでにあなたが簡単に(あなたは[ `orElse`]と部分関数を作成することができorElse

trait ClockActor { 

    def commonOp = { 
     case ... => ... 
    } 

} 

class MasterClock extends Actor with ClockActor { 

    def receive = commonOp orElse masterOp 

    def masterOp = { 
     case ... => ... 
    } 

} 

class SubClock extends Actor with ClockActor { 

    def receive = commonOp orElse subOp 

    def subOp = { 
     case ... => ... 
    } 

} 
1

ことの一つは、このような何かを行うことです。

trait ClockActor { 
    def pf:PartialFunction[String, Boolean] = { 
    case "a" => true 
    case v if(_pf.isDefinedAt(v)) => _pf.apply(v) 
    } 

    def _pf:PartialFunction[String, Boolean] = Map.empty 
} 

object MasterClock extends ClockActor { 

    override def _pf:PartialFunction[String, Boolean] = { 
    case "b" => false 
    } 

    println(pf("a")) 
    println(pf("b")) 

} 

出力れる:

scala> MasterClock 
true 
false 

trueは、形質の部分関数で定義から来てClockActorfalseはオブジェクトMasterClockに由来します。

+0

これはうまくいく。私はあなたが "オーバーライド"すると、元のものに触れることができないという考えを持っていたようです。私がそうしなければならない場合、私はこのやり方を使用しますが、私はサブクラスを実装している人々が親の特性のスーパーや実装を気にする必要がない方法を探しています。 – Alex

+0

@Alex、私はあなたが達成しようとしているものでもっと役立つかもしれない簡単な編集をしました。私はその特性を2つの関数、すなわちパブリックになる 'pf'とデフォルトでは空であり、必要に応じてクラスでオーバーライドされる' _pf'を持つように変更しました。これは本質的に以前のものと同じですが、この方法では、公衆電話が特性の 'pf'機能になるため、superを呼び出す心配はありません。 – jcern

+0

バージョンは動作していますが、まったく異なる方法があります。 'クラスマスター・ノードは、ツリーノード { DEF masterReceiveを拡張:}( "私はマスターのように動作しています")を受信= { 場合 "specificBehaviour"=> {printlnの } オーバーライドDEF受信= masterReceive orElse super.receive } ' ここで、receiveは親の特性で実装することを余儀なくされているメソッドで、サブクラスでの新しい動作の新しい部分関数を作成し、orElseでチェーンします。 – Alex

関連する問題