如何从派生类中的代码块调用超类方法?

时间:2018-03-21 09:35:23

标签: scala

这个问题有点难以总结。以下代码块显示了我想要做的事情。 我有这样一个基类:

<div>
    <img src="cid:{0}" />
    <img src="cid:{1}" />
    <img src="cid:{2}" />
</div>

我还有一个派生类,我希望每个子类方法调用超类方法两次,比较结果并在不匹配时抛出异常(这是针对测试场景)。

但如果我写

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

然后这将无法编译。解决这个问题的唯一方法就是在类 Derived 中提取一个方法,它只调用超类' methB 并从lambda调用中调用它。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我知道你想打电话给超级电话。希望下面是你想要的。

您可以使用关键字super

调用以下内容

(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
  }
}

答案 1 :(得分:0)

原始示例并非完全完整,因为Derived类被定义为另一个scala类的内部类。 在我把这个内部课程移到顶层之后,上面的Praveen的例子突然起作用了。