4

这是一件事:我有一些基础课程,例如:

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

我想要类 extends Car,例如:

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

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

4

5 回答 5

5

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

class Mazda(model: String = "no name") extends Car(model)
于 2012-12-05T21:17:30.693 回答
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在某些情况下为 a 的构造指定Mazda,则有时您无法在Car不带参数的情况下调用构造函数。

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

object Car {
  val DefaultCarModel = "no name"
}
abstract class Car(private val model: String = DefaultCarModel)
class Mazda(model: String = DefaultCarModel) extends Car(model)
于 2015-09-11T14:30:27.573 回答
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

但是:拥有一辆没有型号名称的汽车意味着什么?你确定你是在模拟一个真实的东西吗?

于 2012-12-06T01:17:45.727 回答
0

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

  1. 您本质上需要一个辅助构造Mazda函数,以不同的方式调用超类构造函数
  2. 辅助构造函数最终将调用默认构造函数,其中调用超类构造函数。
  3. 超类构造函数在默认构造函数中仅以一种形式出现。(?)

像 c++ 这样的一些语言可以给你想要的东西,因为构造函数是相互独立的,并且在那里自己调用超类构造函数。在java中,你可以做两种方式,依赖和独立。但是你必须为每个子类编写辅助构造函数,这是更多的工作。

于 2012-12-05T21:56:06.500 回答
0

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

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

您现在可以简单地创建马自达

val car = new Mazda

和模型的价值将是"no name"

于 2012-12-05T21:56:58.747 回答