Scala程序中的扩展类
创始人
2024-04-19 02:10:54
0

我们仍然需要能够创建新的元素对象。你已经看到了因为类Element是抽象的,所以“new Element”不能被用来做这件事。因此,为了实例化一个元素,我们需要创建扩展了Element并实现抽象的contents方法的子类。代码10.3展示了一种可能的方式:

  1. class ArrayElement(conts: Array[String]) extends Element {  
  2.  def contents: Array[String] = conts  
  3. }  

代码 10.3 定义ArrayElement为Element的子类

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

类ArrayElement定义为扩展了类Element。就好象Java里,你在类名之后使用extends子句那样:

  1. ... extends Element ... 
这种extends子句有两个效果:使类ArrayElement从类Element继承所有非私有的成员,并且使ArrayElement成为Element的子类型。由于ArrayElement扩展了Element,类ArrayElement被称为类Element的子类。反过来,Element是ArrayElement的超类。

如果你省略extends子句,Scala编译器隐式地假设你的类扩展自scala.AnyRef,在Java平台上与java.lang.Object一致。因此,类Element隐式地扩展了类AnyRef。你可以在图释10.1上看到这些继承关系。

 ArrayElement的类关系图

图释 10.1 ArrayElement的类关系图

继承:inheritance表示超类的所有成员也是子类的成员,除了以下两点。首先,超类的私有成员不被子类继承。其次,在子类中实现的与超类中的成员具有相同名称和参数的将不被继承到子类中。这种情况我们说子类的成员重载:override了超类的成员。如果子类中的成员是具体的而超类中的是抽象的,我们还可以说具体的成员实现:implement了抽象的。

例如,ArrayElement的contents方法重载(或者可说成:实现)了类Element的抽象方法contents。这个设计的一个漏洞是因为返回数组是可变的,所以客户端能改变它。本书中我们希望事情尽量简化,但当ArrayElement是真实项目中的部分时,你应当考虑代之以返回一个数组的防御性拷贝。另一个问题是我们现在并不确信contents数组所有的String元素具有同样的长度。这可以通过在主构造器中检查前提条件,并且一旦违反则抛出异常的方式来解决。相对的,类ArrayElement从类Element继承了width和height方法。例如,给定ArrayElement的一个对象ae,你可以使用ae.width查询其长度,就好象width是定义在类ArrayElement中一样:

  1. scala> val ae = new ArrayElement(Array("hello", "world"))  
  2. ae: ArrayElement = ArrayElement@d94e60 
  3. scala> ae.width  
  4. res1: Int = 5 
子类型化:subtyping是指子类的值可以被用在需要其超类的值的任何地方。例如:

  1. val e: Element = new ArrayElement(Array("hello")) 
变量e被定义为类型Element,所以其初始化的值也应当是Element。实际上,初始化值的类型是ArrayElement。这也没问题,因为类ArrayElement扩展了类Element,并且因此,类型ArrayElement适用于类型Element。想了解更多子类和子类型之间的差异,参见词汇表中的subtype。

图释10.1还展示了存在于ArrayElement和Array[String]之间的组合:composition关系。这种关系被称为组合的原因是由于类ArrayElement是被Array[String]“组合”出来的。因此Scala编译器将在它为ArrayElement产生的二进制类中安置一个字段用来保留传入的conts数组的引用。我们将在本章后续内容中讨论一些关于组合和继承的设计理念,详见10.11节。

【相关阅读】

  1. 在Scala中定义无参数方法
  2. 学习Scala的二维布局库和抽象类
  3. Scala学习:叫名参数by-name parameter
  4. Scala:如何编写新的控制结构
  5. Scala学习:Curry化的函数

相关内容

热门资讯

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