Scala 組合和繼承–擴(kuò)展類

2018-09-28 18:26 更新

組合和繼承–擴(kuò)展類

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

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

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

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

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

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

ArrayElement 繼承了 Element 的所有非私有成員,同時(shí)定義了一個(gè) contents 函數(shù),這個(gè)函數(shù)中其父類(基類)中是抽象的,因此可以說(shuō) ArrayElement 中的 contents 函數(shù)實(shí)現(xiàn)了父類中的這個(gè)抽象函數(shù),也可以說(shuō)“重載”(override)了父類中的同名函數(shù)。ArrayElement 繼承了 Element 的 width 和 height 方法,因此你可以使用 ArrayElement.width 來(lái)查詢寬度,比如:

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)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)