这是一件事:我有一些基本的课,例如:
abstract class Car(private val model: String = "no name")
我希望课程扩展Car
,例如:
class Mazda(model: String) extends Car(model)
我的问题是:如何在没有给定模型的情况下创建Mazda实例:new Mazda
并且具有名称为no name
的对象?
答案 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)
我觉得这是不可能的,并试图解释原因:
Mazda
的辅助构造函数,它以不同的方式调用超类构造函数像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
但是:拥有没有型号名称的汽车意味着什么?你确定你正在塑造真实的东西吗?