2011-12-13 59 views
1

我試圖讓使用演員一個基類,有點像這樣:斯卡拉演員發送消息超類

import scala.actors.Actor 


case class FooBar() 


class ParentActor extends Actor { 



def act { 

    loop { 

    react { 

     case f: FooBar => 

     println("Parent Foo") 

     case _ => 

     println("Parent something") 

    } 

    } 

} 

} 

然後,我希望有一個子類看起來像這樣:

class ChildActor extends ParentActor { 

    override def act { 

    loop { 

     react { 

     case i: Integer => 

      println("Child int") 

     case default => 

      println("Child Base") 
      super ! default 


     } 

    } 


    } 


} 

我的最終目標是在父actor類中提供一個基本功能,如果該子actor不響應該case類,將會執行該基類功能。我試圖做

super ! Message 

但是,這將引發一個錯誤:

'.' expected but identifier found.

我如何傳遞一個消息從ChildActor到基ParentActor行爲的功能?

回答

1

處理接收到的消息的代碼是PartialFunction,它被傳遞給react方法 - 換句話說就是這種情況的block/closure。直接調用在其他方法(包括超類的方法)內聲明的閉包是不可能的,除非該方法以某種方式傳遞給你一個對閉包實例的引用。並且應該避免通過繼承來重複使用代碼。

由於大小寫區塊爲PartialFunction,因此可以使用orElse方法組合多個此類區塊。這樣,您可以合併多個大小寫區塊,以便在消息不匹配的情況下回退到下一個大小寫區塊。

您不需要繼承來組成處理程序 - 只需在某處作爲函數公開「父處理程序」,然後在調用react之前將它們組合起來。或者爲了減少樣板並使ChildActor不知道父代碼中的代碼,請覆蓋ParentActor中的react方法,然後在將代理傳遞給super.react之前先組合處理程序。

+0

好吧,這是有道理的。謝謝你的幫助! – sokket