第六章介紹了Scala面向對象的基本概況,本章會比較類之間的兩種基本關系:組合與繼承,除此之外,還將討論更多面向對象的細節。
-
組合
- 指一個類特有另一個的引用,借助被引用的類完任務。
-
繼承
- 基礎是超類/子類的關系。
-
抽象類
- 具有抽象成員的類本身必須被聲明為抽象的,用關鍵字 abstract
- 只被聲明但沒有實現的方法稱為抽象方法
-
定義無參數方法 無參數方法的風格即省略空括號
- 通常,只要方法中沒有參數并且方法僅能通過讀取所包含對象的屬性去訪問可變狀態,就使用無參數方法
- 取值時,不寫括號
- 改值時,寫括號
-
擴展類
- 就是Java中的派生
- 繼承表示超類的所有成員也是子類的成員
- 超類的私有成員不會被子類繼承
- 超類中的成員若和子類中有相同的名稱和參數則不會被子類繼承
-
重寫方法和字段
- 字段和方法術語相同的命名空間
- 字段可以重寫無參數方法
- 支持統一訪問原則
- Scala禁止在同一個類里用同樣的名稱定義字段和方法
- 命名空間
- Java有四個命名空間:字段、方法、類型、包
- Scala只有兩個命名空間:值(字段、方法、包還有單例對象),類型(類和特質名)
-
定義參數化字段
~~~
class Cat {
val dangerous = false;
}
class Tiger {
override val dangerous : Boolean;
private var age : Int;
} extends Cat
~~~
~~~
等同于:
~~~
~~~
class Tiger(param1 : Boolean, param2 : Boolean) extends Cat {
override val dangerous = param1;
private var age = param2;
}
~~~
~~~
這樣的寫法稱之為提前定義,也就是定義參數化字段
~~~
-
調用超類構造器
- 把要傳遞的參數或參數列表放在超類名之后的括號里即可
-
使用override修飾符
- 若子類成員重寫了父類的具體成員則必須帶有這個修飾符,若實現的是同名的抽象成員時,則這個修飾符是可選的
- 該規則給編譯器提供了便利,可以幫助其避免某些難以捕捉的錯誤并使得對系統的改進更加安全
-
多態和動態綁定
- 父類的變量可以指向子類的對象,這種現象稱之為多態
-
定義final成員
- 確保一個成員不被重寫,需要給改成員添加修飾符 final 來實現
-
使用組合與繼承
- 如果追求的是根本上的代碼重用,通常采用組合而不是繼承