Scala继承父级默认参数class

Scala inheritance default parameter in parent class

我有一个摘要 class,其参数具有默认值。 我不想在所有可能实现的构造函数中重复使用默认值。

abstract class Place(val place: String = "World")
class Message(val message: String = "Hello", p: String) extends Place(p) {
    override def toString = s"$message $place"
}

我想得到什么

new Message("Hi", "Universe") = "Hi Universe" // Ok
new Message("Hi") = "Hi World" // Doesn't work, second parameter is required
new Message() = "Hello World" // Doesn't work, second parameter is required

我考虑过使用省略第二个参数的辅助构造函数,但这没有帮助,因为您不能在主构造函数之外调用超级构造函数。

我想知道怎么做,或者为什么不可能。我不是在寻找解决方法,比如不使用继承。

恐怕这是不可能的。很简单,您正在将一个值传递给 Place 构造函数,因此它不会使用默认值,无论它的值是多少。如果您不介意使用 var 而不是 val,这里有一个适用于您的 3 个案例的变体:

abstract class Place(var place: String = "World")
class Message(val message: String = "Hello") extends Place()
{
   def this(message: String, place: String) = {
      this(message)
      this.place = place
   }
   override def toString = s"$message $place"
}

恕我直言,Scala 中的构造函数有点乱。有时更好的答案是在伴随对象上使用工厂 apply() 方法,这样更灵活。

您可以以更优雅的方式重用默认值:

object Place {
  val defaultPlace = "World"
}
abstract class Place(val place: String = Place.defaultPlace)
class Message(val message: String = "Hello", p: String = Place.defaultPlace) extends Place(p) {
  override def toString = s"$message $place"
}