如何委托Scala中的成员?

Bil*_*ill 16 proxy scala

在Scala中是否可以编写如下内容:

trait Road {
  ...
}

class BridgeCauseway extends Road {
  // implements method in Road
}

class Bridge extends Road {
  val roadway = new BridgeCauseway()

  // delegate all Bridge methods to the `roadway` member
}
Run Code Online (Sandbox Code Playgroud)

或者我是否需要逐个实现每个Road方法,并调用相应的方法roadway

Rex*_*err 18

完成此操作的最简单方法是使用隐式转换而不是类扩展:

class Bridge { ... }
implicit def bridge2road(b: Bridge) = b.roadway
Run Code Online (Sandbox Code Playgroud)

只要你不需要Bridge携带原件(例如你要存放Bridge在一个集合中Road).

如果确实需要Bridge再次返回,可以添加一个返回an 的owner方法,使用构造函数参数设置它,然后使用模式匹配来获取桥:RoadAnyBridgeCauseway

trait Road {
  def owner: Any
  ...
}

class BridgeCauseway(val owner: Bridge) extends Road { . . . }

class Bridge extends Road {
  val roadway = new BridgeCauseway(this)
  ...
}

myBridgeCauseway.owner match {
  case b: Bridge => // Do bridge-specific stuff
  ...
}
Run Code Online (Sandbox Code Playgroud)