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在这里写给您的任何评论。请把你的好答案的最后一句读几遍,试着想想它怎么会被别人误解。