考虑以下示例:
abstract class Item {
def price: Double
def description: String
}
class SimpleItem1(override val price: Double, override val description: String) extends Item{}
class SimpleItem2(val price: Double, val description: String) extends Item{}
Run Code Online (Sandbox Code Playgroud)
它成功编译,两个扩展类都有相同的方法.它们实际上是一样的吗?如果不是 - 有什么区别?如果是 - 请向我解释一下,例如:为什么他们认为'覆盖'在这里是可选的?
因为price并且description是抽象的Item,所以不需要使用override修饰符.如果它们具有默认实现,则必须添加override修饰符.
因此,在SimpleItem1改进剂中,改性剂是多余的.在某些情况下,添加override"以防万一"是有道理的.例如,如果您定义了一个特性,您可能希望将其混合到具有默认实现的类中.
这是一个例子,哪里override会有所作为:
trait Item0 {
def price: Int
}
trait Item1 extends Item0 {
def price = 33
}
trait Item2 extends Item0 {
override def price = 33
}
object Foo1 extends Item1 // ok
object Foo2 extends Item2 // ok
object Foo3 extends Item0 with Item1 // ok
object Foo4 extends Item2 with Item1 // NOPE!
object Foo4 extends Item1 with Item2 // aha!
Run Code Online (Sandbox Code Playgroud)
一般来说,你应该override尽可能避免使用.