Scala 組合和繼承–擴展類

2018-09-28 18:26 更新

組合和繼承–擴展類

我們需要能夠創(chuàng)建新的布局元素對象,前面定義的 Element 為抽象類,不能直接用來創(chuàng)建該類的對象,因此我們需要創(chuàng)建 Element 的子類。這些子類需要實現(xiàn) Element 類定義的抽象函數(shù)。

Scala 中派生子類的方法和 Java一樣,也是通過 extends 關(guān)鍵字。比如定義一個 ArrayElement:

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

其中 extends 具有兩個功效,一是讓 ArrayElement 繼承所有 Element 類的非私有成員,第二使得 ArrayElement 成為 Element 的一個子類。而 Elemen t稱為 ArrayElement 的父類。

如果你在定義類時沒有使用 extends 關(guān)鍵字,在 Scala 中這個定義類缺省繼承自 scala.AnyRef,如同在 Java 中缺省繼承自 java.lang.Object。這種繼承關(guān)系如下圖:

這幅圖中也顯示了 ArrayElement 和 Array[String] 之間的“組合”關(guān)系”(composition),類 ArrayElement 中定義了對 Array[String]類型對象的一個引用。

ArrayElement 繼承了 Element 的所有非私有成員,同時定義了一個 contents 函數(shù),這個函數(shù)中其父類(基類)中是抽象的,因此可以說 ArrayElement 中的 contents 函數(shù)實現(xiàn)了父類中的這個抽象函數(shù),也可以說“重載”(override)了父類中的同名函數(shù)。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"))
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號