鍍金池/ 教程/ Scala/ 組合和繼承–擴(kuò)展類
包對(duì)象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達(dá)式
類和對(duì)象 (三)
操作基本數(shù)據(jù)類型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類和對(duì)象 (二)
組合和繼承–定義 factory 對(duì)象
組合和繼承–多態(tài)和動(dòng)態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡(jiǎn)化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問(wèn)控制修飾符
Trait 示例–Rectangular 對(duì)象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無(wú)參數(shù)方法
類和對(duì)象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問(wèn)控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對(duì)象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對(duì)象 (四)
函數(shù)–尾遞歸
沒(méi)有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類
函數(shù)–部分應(yīng)用的函數(shù)
開(kāi)始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來(lái)實(shí)現(xiàn)可疊加的修改操作

組合和繼承–擴(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)系如下圖:

http://wiki.jikexueyuan.com/project/scala-development-guide/images/11.png" alt="" />

這幅圖中也顯示了 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"))