[Scala]繼承類別 建構式先後

  • 621
  • 0
  • 2014-07-09

[Scala]繼承類別 建構式先後

  1. 子類繼承父類,會先執行父類建構式,在執行子類建構式。
  2. 有一些情形,想要先執行子類建構式,在執行父類建構式,這是可能發生的情境,以下將說明。
      • 解決方法:於類別作用區域後加上 with 父類名
  3. 細節於代碼備註中。

 

 

  • 以下範例 出自 快學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=2
   7:  
   8: }

 

  • 客戶端調用
   1: object MyApp extends App
   2: {
   3:   
   4:   val ant:Ant=new Ant
   5:   println(ant.env.length)
   6:  
   7: }

 

Result:

image 這結果不對了 Ant的rang 應該為2…

  

 

 

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=2
   6:  
   7: }with Creature

 

 

  • 客戶端調用
   1: object MyApp extends App
   2: {
   3:   
   4:   val ant:Ant=new Ant
   5:   println(ant.env.length)
   6:  
   7: }

 

Result:

image

 

 

 

 

By-藍小伙