簡體   English   中英

如何從派生類的代碼塊中調用超類方法?

[英]How can I call a super class method from a code block in a derived class?

這個問題很難概括。 下面的代碼塊顯示了我想做什么。 我有一個這樣的基類:

 `class Base {
   def methA:String="ook"
   def methB:Int=1
}

我還有一個派生類,我希望每個子類方法兩次調用超類方法,比較結果並在不匹配時拋出異常(這是針對測試場景的)。

但是如果我寫

class Derived extends Base {

  private def callDoublyAndCompare[T](fun:()=>T) : T = {
      val fst=fun()
      val snd=fun()
      if(fst!=snd) throw new RuntimeException(s"Mismatch fst=$fst != snd=$snd")
      snd
  }

  override def methB:Int={
     callDoublyAndCompare(() => super[Derived].methB)
  }
}

然后,它將無法編譯。 解決此問題的唯一方法是提取類Derived中的方法,該方法僅調用超類的methB並從lambda調用中進行調用。

有沒有更好的辦法?

我了解您要調用超級調用方法。 希望下面是您想要的。

您可以使用關鍵字“ super only”按如下方式調用

(new Derived).methB 這將根據您的代碼兩次調用callDoublyAndCompare超級調用方法。

class Derived extends Base {

  private def callDoublyAndCompare[T](fun:()=>T) : T = {
      val fst=fun()
      val snd=fun()
      if(fst!=snd) throw new RuntimeException(s"Mismatch fst=$fst != snd=$snd")
      snd
  }

  override def methB:Int={
     callDoublyAndCompare(() => super.methB) //kept only super
  }
}

就Derived類被定義為另一個Scala類的內部類而言,原始示例尚未完全完成。 在我將這個內部類移到最高級別之后,上面Praveen的示例突然起作用了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM