请考虑以下示例:
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{}
它成功编译,两个扩展类都有相同的方法。它们实际上是一样的吗?如果不是 - 有什么区别?如果是 - 请向我解释一下,例如:为什么他们认为'覆盖'在这里是可选的?
答案 0 :(得分:9)
由于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!
一般情况下,您应该尽可能避免使用override
。