Scala构造函数继承

时间:2012-12-05 21:08:33

标签: scala inheritance constructor

这是一件事:我有一些基本的课,例如:

abstract class Car(private val model: String = "no name")

我希望课程扩展Car,例如:

class Mazda(model: String) extends Car(model)

我的问题是:如何在没有给定模型的情况下创建Mazda实例:new Mazda并且具有名称为no name的对象?

5 个答案:

答案 0 :(得分:5)

要实现目标,您必须在子类中定义默认值:

class Mazda(model: String = "no name") extends Car(model)

答案 1 :(得分:1)

我认为你的问题还没有完全回答,部分原因是你没有接受yakshaver的回答。答案建议你这样做:

abstract class Car(private val model: String = "no name")
class Mazda(model: String = "no name") extends Car(model)

在这种情况下,调用new Mazda会为您提供所需的结果。但它并不完全令人满意,因为魔术字符串"no name"出现在两个不同的地方。你可能希望你可以找到一种方法来调用Car构造函数中没有参数的Mazda构造函数,可能是这样的:

// does not compile!
class Mazda(model: String) extends Car(model) {
    def this() { super() } // attempt at an auxiliary constructor
}

不幸的是,任何辅助构造函数都必须直接或间接地调用该类的主要构造函数。因此,如果您希望能够在某些情况下指定model来构造Mazda,则有时无法在没有参数的情况下调用Car构造函数。< / p>

如果你想避免魔术"no name"字符串的重复,最好的办法就是把它拉到一个常数的某个地方。例如,像这样:

object Car {
  val DefaultCarModel = "no name"
}
abstract class Car(private val model: String = DefaultCarModel)
class Mazda(model: String = DefaultCarModel) extends Car(model)

答案 2 :(得分:0)

我觉得这是不可能的,并试图解释原因:

  1. 你本质上想要一个Mazda的辅助构造函数,它以不同的方式调用超类构造函数
  2. 辅助构造函数最终将调用默认构造函数,其中调用了超类构造函数。
  3. 超类构造函数仅在默认构造函数中以一种形式出现。 (?)
  4. 像c ++这样的语言可以为你提供你想要的东西,因为构造函数彼此独立并且在那里调用超类构造函数。在java中,您可以做两种方式,依赖和独立。但是你必须为每个子类编写辅助构造函数,这更有用。

答案 3 :(得分:0)

不确定这是你想要的,但是

abstract class Car(private val model: String = "no name")
class Mazda extends Car

您现在可以使用

创建一个马自达
val car = new Mazda

,模型的值为"no name"

答案 4 :(得分:0)

如何扩展没有名字的东西?

trait DefaultNameIsNoName extends Car {
  override name = "no name"
}

class Fiat extends Car with DefaultNameIsNoName

或者有另一个可以继承的无名类:

class NoNameCar extends Car with DefaultNameIsNoName

class Packard extends NoNameCar

但是:拥有没有型号名称的汽车意味着什么?你确定你正在塑造真实的东西吗?