Scala开发教程(32): 组合和继承–扩展类

jerry Scala 2015年11月25日 收藏

我们需要能够创建新的布局元素对象,前面定义的Element为抽象类,不能直接用来创建该类的对象,因此我们需要创建Element的子类。这些子类需要实现Element类定义的抽象函数。
Scala中派生子类的方法和Java一样,也是通过extends关键字。比如定义一个ArrayElement:

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

其中extends具有两个功效,一是让ArrayElement继承所有Element类的非私有成员,第二使得ArrayElement成为Element的一个子类。而Element称为ArrayElement的父类。
如果你在定义类时没有使用extends关键字,在Scala中这个定义类缺省继承自scala.AnyRef,如同在Java中缺省继承自java.lang.Object. 这种继承关系如下图:
20131113001

这幅图中也显示了ArrayElement和Array[String]之间的“组合”关系”(composition),类ArrayElement 中定义了对Array[String]类型对象的一个引用。

ArrayElement继承了Element的所有非私有成员,同时定义了一个contents函数,这个函数中其父类(基类)中是抽象的,因此可以说ArrayElement中的contents函数实现了父类中的这个抽象函数,也可以说“重载”(override)了父类中的同名函数。ArrayElement继承了Element的width和height方法,因此你可以使用 ArrayElement.width来查询宽度,比如:

scala> val ae=new ArrayElement(Array("hello","world"))
ae: ArrayElement = ArrayElement@729c1e43

scala> ae.width
res0: Int = 5

派生也意味着子类的值可以用在任何可以使用同名父类值的地方,比如:

val e: Element = new ArrayElement(Array("hello"))