2011-12-13 47 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