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的直接子类会更好一些,就像这样:

class LineElement(s: String) extends Element {
 val contents = Array(s)
 override def width = s.length
 override def height = 1
}

前一个版本中,LineElement与ArrayElement有一个继承关系,从那里继承了contents。现在它与 Array有一个组合关系:在它自己的contents字段中持有一个字串数组的引用。类ArrayElement也与 Array有组合关系,因为它的参数化contents字段持有字串数组的引用。ArrayElement的代码展示在第xx 页的代码10.5中。其组合关系用一个菱形表现在类图中,正如展示在第xx页的图释10.1中那样。有了 LineElement的这个实现,Element的继承层级现在看上去如展示在图释10.4中那样。

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索问题
, 组合
, element
, 层级
, contents
, 一个
, 组合继承
类继承问题
,以便于您获取更多的相关知识。

时间: 2024-08-01 10:35:18

Scala学习:使用组合与继承的相关文章

设计模式学习:组合复用原则

组合复用原则定义: 在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的 另外一种说法是:尽量使用(对象)组合,而非继承 那么组合和继承各自有什么特点,优缺点,为什么要有这样的优先呢!先来比较一下组合和继承. 组合 VS. 继承 组合复用的优点和缺点 组合 优点: 1容器类仅能通过被包含对象的接口来对其进行访问. 2"黑盒"复用,因为被包含对象的内部细节对外是不可见. 3  封装性好. 4  通过获取指向其它的具有相同类型的对

JavaScript设计模式学习之“类式继承”

 这篇文章主要介绍了JavaScript设计模式学习之"类式继承",本文直接用代码实例讲解类式继承的实现方法,需要的朋友可以参考下     在做一件事情之前,首先要清楚做这件事情的好处有什么,相信不会有哪个人愿意无缘无故的去做事情.一般说来,我们在设计类的时候,实际上就是希望能减少重复性的代码,使用继承可以完美的做到这一点,借助继承机制,你可以在现有类的基础上再次进行设计并且充分利用它们已经具备的各种方法,而对设计的修改也更为轻松.废话不多说了,举例说明: 代码如下: function

新人学习java。在继承上遇到的一个小问题

问题描述 新人学习java.在继承上遇到的一个小问题 代码如下: package construter; class Game { Game(int i){ System.out.println("Game"); }; } class BoarderGame extends Game{ BoarderGame(int i){ super(i);//当我把super参数中的i替换成一个int型数字时就会报错?? System.out.println("BoarderGame c

C++第13周项目5 - 类的组合与继承

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8953304 [项目5(选做)]类的组合与继承(1)先建立一个Point(点)类,包含数据成员x,y(坐标点):(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心:(3)编写上述两类中的构造.析构函数及必要的输入输

C++编程规范之34:用组合代替继承

摘要:     避免继承带来的重负:继承是C++中第二紧密的耦合关系,仅此于友元关系.紧密的耦合是一种不良现象,应该尽量避免.因此,应该用组合代替继承,除非知道后者确实对设计有好处. 与继承相比,组合有如下优点: 1.      在不影响调用代码的情况下具有更大的灵活性. 2.      更好的编译时间隔,更短的编译时间. 3.      奇异现象减少. 4.      更广的适用性. 5.      更健壮.更安全. 6.      复杂性和脆弱性降低.

机器学习(三)--- scala学习笔记

 Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性.    Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法. 一.sca

Scala学习笔记

1类型自动匹配(模式匹配) 2函数是有值的(匿名函数是函数的常态) 递归函数需要指定返回值 3.内部类隶属于外部类的实例本身,而java内部类属于外部类,对外部类的依赖路径依赖 4.object类似于java中的静态内部类 里面的所有成员都是静态的,适用于配置文件 静态都是用来修饰类的内部成员的.比如静态方法.静态成员变量.它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得.这样静态内部类就可以理解了,它可以直接被用 外部类名+内部类名 获得. 5.同

Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)

MainActivity如下: package cc.testviewstudy4; import java.util.ArrayList; import java.util.HashMap; import cc.testviewstudy4.ListViewSubClass.OnDeleteListener; import android.os.Bundle; import android.widget.SimpleAdapter; import android.app.Activity; /

Scala 学习笔记(转)

问题描述 scala是以实现scaleablelanguage为初衷设计出来的一门语言.官方中,称它是object-orientedlanguage和functionallanguage的混合式语言.并且,scala可以和java程序无缝拼接,因为scala文件编译后也是成为.class文件,并且在JVM上运行.不过,我更关心的是它的scaleable(扩展性).一门语言到底怎样才算有扩展性呢?对语言而言什么是它的扩展性呢?个人拙见,认为语言的扩展性可能包括两个方面:1.语言本身的扩展性2.由此