[Scala]繼承類別 建構式先後
- 子類繼承父類,會先執行父類建構式,在執行子類建構式。
-
有一些情形,想要先執行子類建構式,在執行父類建構式,這是可能發生的情境,以下將說明。
-
- 解決方法:於類別作用區域後加上 with 父類名
-
- 細節於代碼備註中。
-
以下範例 出自 快學Scala:
-
- 假設 每種生物(Creature)都能感知周遭範圍,只是範圍不一樣
- 現在有一種生物 螞蟻 。在實作上 繼承 生物類別 然後做衍伸
-
Scala:(錯誤範例)
- 父類:
1: class Creature {2:
3: def rang:Int=10
4: val env:Array[Int]=new Array[Int](rang)5:
6: }
- 子類
1: // 會先執行 Creature 建構式 然後在執行Ant建構式2: //但 val rang 也宣告了 這是不可變的3: //那到底rang 會是 10.....還是 2?4: class Ant extends Creature {5:
6: override val rang=27:
8: }
- 客戶端調用
1: object MyApp extends App2: {
3:
4: val ant:Ant=new Ant5: println(ant.env.length)
6:
7: }
Result:
Scala:(正解範例)
- 父類:
1: class Creature {2:
3: def rang:Int=10
4: val env:Array[Int]=new Array[Int](rang)5:
6: }
- 子類:
1: //有帶With 等於首先進入Ant 建構式(一般會先進入父類(繼承類)的建構式)2: // Ant覆寫父類項目後,將不再於父類建構式實例被子類覆寫的項目3: class Ant extends {4:
5: override val rang=26:
7: }with Creature
- 客戶端調用
1: object MyApp extends App2: {
3:
4: val ant:Ant=new Ant5: println(ant.env.length)
6:
7: }
Result:
By-藍小伙