父类中的Scala继承默认参数

时间:2015-05-19 12:50:35

标签: scala inheritance default-parameters

我有一个抽象类,其参数有一个默认值。 我不想在所有可能的实现的构造函数中重用默认值。

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

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

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

2 个答案:

答案 0 :(得分:3)

我担心这是不可能的。很简单,您将值传递给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()方法,这些方法更灵活。

答案 1 :(得分:1)

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

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