使用Scala在Request Response消息传递设计中键入继承误解

时间:2012-12-11 21:17:27

标签: scala design-patterns generics inheritance matching

我正在尝试使用scala创建一个小型消息传递系统。 我无法弄清楚如何使用//问题解决这个类/类型/泛型/层次结构问题

逻辑是:Request有一个函数列表,可以在到达时使用响应进行调用。当Response到达时,将调用getResult并使用模式匹配。似乎我无法调用Request上的list中的函数,这些函数可以被Response的任何子类型重载?

object Worksheet {
    class Request {
        //var op = List[( _<:Response ) => Unit]()
        var op = List[Response => Unit]()             // FIXED
    }
    class Response {}
    class MyResult extends Response {}
    class AnotherMyResult extends Response {}

    val map = Map[String, Request]()                  

  def getResult(a:Any) {
    a match {
            ...
        case r:Response =>
            //map.get("").get.op foreach ((o) => o(r)) //PROBLEM 
                      map("").op foreach ((o) => o(r))        //NO PROBLEM 
            ...
    }
  }                                               
}

请帮助;)

修改

  def simpleop (r:MyResult) : Unit = { }

  def req = new Request()
  req.op += simpleop _                      //PROBLEM STILL

  map += ("" -> req)

1 个答案:

答案 0 :(得分:0)

您无法使用simpleop类型的参数调用方法Response,因此您不能同时拥有case r:Response => map("").op foreach ((o) => o(r))req.op += simpleop _