2011-09-17 69 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'應由'BarListener'由'FooListener'和'BarEvent'處理。 –

+1

我明白了,那麼tenshi有個很好的答案。你想要的並不是那些可以通過繼承完成的事情。順便說一句,如果你在你的'act()'方法中放置了「override」修飾符,那麼線性化將使子類('ListensBarAndFoo')中最左邊的'act()'方法(來自'FooListener')獲勝。 –

回答

5

react指定act()預計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)