这是一件事:我有一些基础课程,例如:
abstract class Car(private val model: String = "no name")
我想要类 extends Car
,例如:
class Mazda(model: String) extends Car(model)
我的问题是:如何在没有给定模型的情况下创建 Mazda 实例:new Mazda
并拥有带有名称的对象no name
?
这是一件事:我有一些基础课程,例如:
abstract class Car(private val model: String = "no name")
我想要类 extends Car
,例如:
class Mazda(model: String) extends Car(model)
我的问题是:如何在没有给定模型的情况下创建 Mazda 实例:new Mazda
并拥有带有名称的对象no name
?
为了实现您的目标,您必须在子类中定义默认值:
class Mazda(model: String = "no name") extends Car(model)
我认为您的问题尚未得到完全回答,部分原因是您尚未接受 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)
扩展一些没有名字的东西怎么样?
trait DefaultNameIsNoName extends Car {
override name = "no name"
}
class Fiat extends Car with DefaultNameIsNoName
或者有另一个可以继承的无名类:
class NoNameCar extends Car with DefaultNameIsNoName
class Packard extends NoNameCar
但是:拥有一辆没有型号名称的汽车意味着什么?你确定你是在模拟一个真实的东西吗?
我觉得这是不可能的,并尝试解释原因:
Mazda
函数,以不同的方式调用超类构造函数像 c++ 这样的一些语言可以给你想要的东西,因为构造函数是相互独立的,并且在那里自己调用超类构造函数。在java中,你可以做两种方式,依赖和独立。但是你必须为每个子类编写辅助构造函数,这是更多的工作。
不确定这是你想要的,但是
abstract class Car(private val model: String = "no name")
class Mazda extends Car
您现在可以简单地创建马自达
val car = new Mazda
和模型的价值将是"no name"