Scala学习:使用组合与继承
创始人
2024-04-19 03:30:52
0

组合与继承是利用其它现存类定义新类的两个方法。如果你接下来的工作主要是代码重用,通常你应采用组合而不是继承。只有继承受脆基类问题之苦,这种情况你可能会无意中通过改变超类而破坏了子类。

51CTO编辑推荐:Scala编程语言专题

关于继承关系你可以问自己一个问题,是否它建模了一个is-a关系。Meyers,《Effective C++》 【Mey91】例如,说ArrayElement是Element是合理的。你能问的另一个问题是,是否客户想要把子类类型当作超类类型来用。Eckel,《Thinking in Java》【Eck98】在ArrayElement的例子里,我们的确期待客户会想要把ArrayElement当作Element使用。

如果你对展示在图释10.3的继承关系问了这些的问题,那么是否感觉其中的任何关系有可疑吗?尤其是,对你来说LineElement是ArrayElement是否显而易见呢?你是否认为客户会需要把LineElement当作ArrayElement使用?实际上,我们把LineElement定义为ArrayElement主要是想重用ArrayElement的contents定义。因此或许把LineElement定义为Element的直接子类会更好一些,就像这样:

  1. class LineElement(s: String) extends Element {  
  2.  val contents = Array(s)  
  3.  override def width = s.length  
  4.  override def height = 1 
  5. }  
前一个版本中,LineElement与ArrayElement有一个继承关系,从那里继承了contents。现在它与Array有一个组合关系:在它自己的contents字段中持有一个字串数组的引用。类ArrayElement也与Array有组合关系,因为它的参数化contents字段持有字串数组的引用。ArrayElement的代码展示在第xx页的代码10.5中。其组合关系用一个菱形表现在类图中,正如展示在第xx页的图释10.1中那样。有了LineElement的这个实现,Element的继承层级现在看上去如展示在图释10.4中那样。

 修改了LineElement后的类层级 

图释 10.4 修改了LineElement后的类层级

【相关阅读】

  1. 在Scala中定义final成员
  2. Scala程序中如何实现多态和动态绑定
  3. Scala学习:调用超类构造器和override修饰符的使用
  4. Scala:重载方法和字段及定义参数化字段
  5. Scala程序中的扩展类

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...