You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在派生类代码块中调用父类方法并实现双重调用校验?

解决派生类调用父类方法两次并对比结果的问题

嗨,我来帮你搞定这个Scala的实现问题!核心思路是利用Scala的super关键字调用父类方法,再把这个调用逻辑传递给你写的私有工具方法来完成两次调用和对比。

首先,先把你的callDoublyAndCompare私有方法补全,然后在派生类的每个重写方法里,通过super指向父类的对应方法,把它包装成无参函数传给私有方法就行。

完整实现代码

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 IllegalStateException(s"两次调用父类方法结果不匹配:第一次=$fst,第二次=$snd")
    }
    // 匹配则返回结果
    fst
  }

  // 重写methA,调用父类方法两次并对比
  override def methA: String = callDoublyAndCompare(() => super.methA)
  // 重写methB,复用同样的对比逻辑
  override def methB: Int = callDoublyAndCompare(() => super.methB)
}

关键细节解释

  • 调用父类方法:用super.methA/super.methB明确指定调用父类的实现,避免递归调用派生类自己的重写方法。
  • 复用对比逻辑:私有方法callDoublyAndCompare负责统一处理两次调用、结果对比和异常抛出,让每个业务方法的代码更简洁,符合DRY(Don't Repeat Yourself)原则。
  • 泛型支持:因为父类方法返回不同类型(String和Int),用泛型T让私有方法能处理任意返回类型的方法调用。

测试验证

如果父类方法是无状态的(比如你的原始Base类),调用派生类方法会正常返回结果;如果父类方法是有状态的(每次调用返回不同值),就会触发异常:

// 正常情况测试
val d = new Derived()
println(d.methA) // 输出: ook
println(d.methB) // 输出: 1

// 有状态父类的测试(会触发异常)
class UnreliableBase extends Base {
  private var counter = 0
  override def methA: String = {
    counter += 1
    s"ook$counter"
  }
}

class UnreliableDerived extends UnreliableBase {
  private def callDoublyAndCompare[T](fun: () => T): T = {
    val fst = fun()
    val snd = fun()
    if (fst != snd) {
      throw new IllegalStateException(s"两次调用父类方法结果不匹配:第一次=$fst,第二次=$snd")
    }
    fst
  }

  override def methA: String = callDoublyAndCompare(() => super.methA)
}

val ud = new UnreliableDerived()
ud.methA // 抛出异常:IllegalStateException: 两次调用父类方法结果不匹配:第一次=ook1,第二次=ook2

内容的提问来源于stack exchange,提问作者Wolfgang Liebich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:35:12