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

Scala中继承类时是否会继承辅助构造函数?附代码示例

子类能否访问父类的辅助构造函数?

直接给你明确答案:在Scala里,子类没办法直接访问或者调用父类的辅助构造函数。子类的所有构造函数(不管是主构造还是辅助构造),第一条语句必须是调用父类的主构造函数(通过extends子句),或者调用子类自己的另一个构造函数(而那个构造函数最终也会绕回到调用父类主构造的逻辑)。

看你当前的代码,new Car(10,"Maruti")这行肯定会编译报错——因为你的Car类只定义了接收一个Int参数的主构造函数,根本没有处理Int + String这种参数组合的辅助构造。

你父类learnInheritance的辅助构造函数是通过this(speed)调用了自身主构造,然后额外打印了速度和模型信息,但这个辅助构造的逻辑子类没法直接“继承”过来用。要解决你的问题,你需要给Car类也添加一个对应的辅助构造函数,像这样:

class learnInheritance(speed: Int) {
  val mph: Int = speed
  def race() = println("Racing")

  def this(speed: Int, model: String) {
    this(speed)
    println("Speed of call is " + speed + " and model is " + model)
  }
}

class Car(speed: Int) extends learnInheritance(speed) {
  override val mph: Int = speed
  override def race() = println("Racing Car")

  // 给子类添加双参数的辅助构造
  def this(speed: Int, model: String) {
    this(speed) // 先调用子类主构造,间接触发父类主构造的初始化
    // 这里可以添加子类自己的逻辑,比如复刻父类的打印行为
    println("Car Speed: " + speed + " and model is " + model)
  }
}

val a = new Car(10,"Maruti")
println("Speed of Car: " + a.mph)
a.race()

如果想避免重复写打印逻辑,更优雅的方式是把父类里的打印逻辑抽成一个受保护的方法,这样子类就能直接复用:

class learnInheritance(speed: Int) {
  val mph: Int = speed
  def race() = println("Racing")

  // 把可复用的逻辑抽成方法
  protected def printSpeedModel(speed: Int, model: String): Unit = {
    println("Speed of call is " + speed + " and model is " + model)
  }

  def this(speed: Int, model: String) {
    this(speed)
    printSpeedModel(speed, model)
  }
}

class Car(speed: Int) extends learnInheritance(speed) {
  override val mph: Int = speed
  override def race() = println("Racing Car")

  def this(speed: Int, model: String) {
    this(speed)
    printSpeedModel(speed, model) // 直接复用父类的方法
  }
}

再总结几个核心规则:

  • 子类构造函数永远只能先调用父类主构造,或者自己的其他构造函数,不能直接调用父类的辅助构造
  • 要支持父类辅助构造的参数组合,必须自己在子类里定义对应的辅助构造
  • 复用逻辑优先抽成方法,别依赖构造函数的代码块

内容的提问来源于stack exchange,提问作者Deepak Garg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:13:14