Scala:使用val覆盖def
考虑以下示例:Scala:使用val覆盖def,scala,inheritance,Scala,Inheritance,考虑以下示例: 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 It
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{}
它编译成功,并且两个扩展类具有相同的方法。它们实际上是一样的吗?如果没有-有什么区别?如果是-请向我解释一下,例如:为什么他们认为“覆盖”在这里是可选的?因为
价格和描述在项目中是抽象的,所以您不需要使用覆盖
修饰符。如果它们有默认实现,则必须添加override
修饰符
因此,在SimpleItem1
中,修饰符是多余的。在某些情况下,添加覆盖
“以防万一”是有意义的。例如,如果您定义了一个特性,您可能希望将其混合到具有默认实现的类中
下面是一个例子,其中覆盖
会产生不同:
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
。好答案,最后一句除外。不编写覆盖
没有好处,它有助于使代码更加清晰和安全,以便将来添加。有些保存的击键不值得这样做(你的例子就是一个不应该编写代码的好例子)。@sschaef-我认为不使用重载的东西是一个好的设计,我支持这一说法。我很少使用重载,我不觉得我遗漏了什么。有些框架,比如Swing,确实可以使用重载,但一般来说,如果你设计类,你应该可以不使用重载。@0\uuuf-我认为sschaef的意思是“每次重写smth时都应该编写重写。即使语法允许,也不应该跳过这个词”。他写这封信是因为你的最后一句话有点让人困惑。我个人将其理解为:“当您重写smth时,如果可以并且语法允许,请不要使用‘override’这个词”。但是我可能在这里对谁的意思是错的:)@GrayR如果没有override
修饰符,你是不允许重写任何内容的。只有在实现抽象方法时才能忽略它。@0\uulol)))。我明白。我不确定您是否理解我或sschaef在这里写给您的任何评论。请把你的好答案的最后一句读几遍,试着想想它怎么会被别人误解。