我如何委派给 Scala 的成员? [英] How can I delegate to a member in Scala?

查看:46
本文介绍了我如何委派给 Scala 的成员?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以在 Scala 中编写如下代码:

Is it possible in Scala to write something like:

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
}

还是需要将Road的每一个方法都一一实现,并在roadway上调用对应的方法?

or do I need to implement each of Road's methods, one by one, and call the corresponding method on roadway?

推荐答案

最简单的方法是使用隐式转换而不是类扩展:

The easiest way to accomplish this is with an implicit conversion instead of a class extension:

class Bridge { ... }
implicit def bridge2road(b: Bridge) = b.roadway

只要您不需要原始的 Bridge 随身携带即可(例如,您要将 Bridge 存储在 Bridge 的集合中>道路).

as long as you don't need the original Bridge to be carried along for the ride (e.g. you're going to store Bridge in a collection of Road).

如果您确实需要再次取回 Bridge,您可以在 Road 中添加一个 owner 方法,该方法返回一个 Any,使用 BridgeCauseway 的构造函数参数设置它,然后进行模式匹配以获取您的网桥:

If you do need to get the Bridge back again, you can add an owner method in Road which returns an Any, set it using a constructor parameter for BridgeCauseway, and then pattern-match to get your bridge:

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
  ...
}

这篇关于我如何委派给 Scala 的成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆