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

2018-09-28 18:26 更新

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

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

這個規(guī)則可以幫助編譯器發(fā)現(xiàn)一些難以發(fā)現(xiàn)的錯誤,可以增強系統(tǒng)安全進化。比如,如果你把 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)的演講尤為重要,假設你定義了一個 2D 圖形庫。你把它公開,并廣泛使用。庫的下一個版本里你想在你的基類 Shape 里增加一個新方法:

def hidden(): Boolean

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

如果圖形庫和它的用戶是用 Scala 寫的,那么客戶的 hidden 原始實現(xiàn)就不會有 override 修飾符,因為這時候還沒有另外一個使用那個名字的方法。一旦你添加了 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í)行,你的客戶將得到一個編譯期錯誤,這常常是更可取的。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號