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

組合和繼承–使用 override 修飾符

在前面的例子 LineElement 使用了 override 來修飾 width 和 height 成員變量,在 Scala 中需要使用 override 來重載父類的一個非抽象成員,實(shí)現(xiàn)抽象成員無需使用 override,如果子類沒有重載父類中的成員,不可以使用 override 修飾符。

這個規(guī)則可以幫助編譯器發(fā)現(xiàn)一些難以發(fā)現(xiàn)的錯誤,可以增強(qiáng)系統(tǒng)安全進(jìn)化。比如,如果你把 height 拼寫錯誤為 hight,使用 override 編譯器會報錯

root@mail:~/scala# scalac demo.scala 
demo.scala:13: error: method hight overrides nothing
  override def hight = 1
               ^
one error found

這個規(guī)則對于系統(tǒng)的演講尤為重要,假設(shè)你定義了一個 2D 圖形庫。你把它公開,并廣泛使用。庫的下一個版本里你想在你的基類 Shape 里增加一個新方法:

def hidden(): Boolean

你的新方法將被用在許多畫圖方法中去決定是否需要把形狀畫出來,這將可以大大提高系統(tǒng)繪圖的性能,但你不可以冒著破壞客戶代碼的風(fēng)險做這件事。畢竟客戶說不定已經(jīng)使用不同的 hidde n實(shí)現(xiàn)定義了 Shape 的子類?;蛟S客戶的方法實(shí)際上是讓對象消失而不是檢測是否對象是隱藏的。因?yàn)檫@兩個版本的 hidden 互相重載,你的畫圖方法將停止對象的消失,這可真不是你想要的!

如果圖形庫和它的用戶是用 Scala 寫的,那么客戶的 hidden 原始實(shí)現(xiàn)就不會有 override 修飾符,因?yàn)檫@時候還沒有另外一個使用那個名字的方法。一旦你添加了 hidden 方法到你 Shape 類的第二個版本,客戶的重編譯將給出像下列這樣的錯誤:

.../Shapes.scala:6: error: error overriding method 
        hidden in class Shape of type ()Boolean; 
method hidden needs 'override' modifier 
def hidden(): Boolean =

也就是說,代之以錯誤的執(zhí)行,你的客戶將得到一個編譯期錯誤,這常常是更可取的。