2011-09-17 2 views
2

モデルにいくつかのイベントがあり、処理ロジックがいくつかあります。コミュニケーションロジックを構成して俳優を欲しい。しかし、私は、各具象クラスメッセージ処理の動作を継承します

簡体例

class Event {} 

case class FooEvent(str : String) extends Event 
case class BarEvent(i : java.lang.Integer) extends Event 

trait FooListener extends Actor { 
    def act() { 
    react{ 
     case FooEvent => print("foo received") 
    } 
    } 
} 
trait BarListener extends Actor { 
    def act() { 
    react{ 
     case BarEvent => print("bar received") 
    } 
    } 
} 
class ListensOnlyBar extends BarListener{} 

//can't be done: 
//error: overriding method act in trait FooListener of type()Unit; 
//method act in trait BarListener of type()Unit needs `override' modifier 
//class ListensBarAndFoo extends FooListener with BarListener{ 
class ListensBarAndFoo extends FooListener with BarListener{} 
+0

@Kipton Barros、これは何について質問です。それらを組み合わせる方法はありますか? –

+0

@Kipton Barros、 'FooEvent'は' FooListener'と 'BarEvent'sによって' BarListener'によって処理されるべきです。 –

+1

私が見ると、テンシは素敵な答えがあります。あなたが望むものは、本当に継承でできることではありません。ところで、あなたの 'act()'メソッドに "override"修飾子を入れると、線形化はサブクラス( 'ListensBarAndFoo')で一番左の' act() 'メソッド(' FooListener'から)を獲得します。 –

答えて

5

reactact()を指定せずに処理ロジックを継承することができますどのようPartialFunction[Any, Unit]を期待して、あなたはうまくそれらを一緒に構成することができます。ここに例があります:

type Listener = PartialFunction[Any, Unit] 

val foo: Listener = { 
    case FooEvent => print("foo received") 
} 

val bar: Listener = { 
    case BarEvent => print("bar received") 
} 

case class GenericListener(listener: Listener) extends Actor { 
    def act() { 
    react(listener) 
    } 
} 

GenericListener(bar) 
GenericListener(foo orElse bar) 
関連する問題