前言 :
Scala 是一個可直譯、編譯、靜態、運行於 JVM 之上、可與 Java 互操作、融合物件導向編程特性與函式編程風格的程式語言. Scala 的繼承作了一些限制,這使你在使用繼承前必須多一份思考.
繼承 :
你建立了一個銀行帳戶類別 :
在 Scala 中,如果你要重新定義父類別中的成員,override 關鍵字是必要的,如果沒有標明 override,編譯器會告訴你,你正定義一個父類別中已經有的成員 :
這避免你在不知情的情況下,重新定義了某個父類別的成員,override 的另一個作用是,如果你指定要 override 某個成員,但父類別中根本不存在該成員(也許是你打錯字了),編譯器也會提出警訊. 假設你為以上的類別建立了一個支票帳戶 :
- class CheckingAccount(override val id: String, override val name: String)
- extends Account(id, name) { // 繼承並呼叫父類別建構式
- private var limit: Int = 30000
- def overdraftLimit = limit
- def overdraftLimit_=(amount: Int) {
- require(amount > 0)
- limit = amount
- }
- override def withdraw(amount: Int) {
- require(amount > 0)
- if(amount <= bal + overdraftLimit) {
- bal -= amount
- }
- else {
- throw new RuntimeException("超出信用")
- }
- }
- override def toString = super.toString +
- "\nOverdraft limit:" + overdraftLimit
- }
在 Scala 中,使用 extends 來指定要繼承自哪個類別,如果需要呼叫父類別建構式,則只有主要建構式能夠呼叫,輔助建構式是不能呼叫父類別建構式的。由於 bal 在父類別中是宣告為 protected,所以可以(也僅能)在子類別中使用(跟 Java 不同的是,Scala 的 protected 並沒有 package-private 的含義)。如果在子類別中,打算呼叫父類別的方法,則可以如範例中,使用 super 來呼叫. 上例中,由於 id 與 name 的定義,與父類別是一致的,所以必須使用 override 指明,你要定義的成員確實是與父類別相同的,如果你不使用override, 則編譯器也會提醒你,你正試圖定義父類別已有的成員 :
如果你在定義類別時,加上 fina l關鍵字,則該類別將不再能被繼承,例如 :
- final class SuperAccount {} // 這個類別不能被繼承
- class FakeAccount {
- final def withdraw(amount: Int) = 0 // 不能被重新定義
- }
* Tutorialspoint - Scala - Classes & Objects
沒有留言:
張貼留言