Scala:用val覆盖def

Gra*_*ayR 1 inheritance scala

考虑以下示例:

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)

它成功编译,两个扩展类都有相同的方法.它们实际上是一样的吗?如果不是 - 有什么区别?如果是 - 请向我解释一下,例如:为什么他们认为'覆盖'在这里是可选的?

0__*_*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!
Run Code Online (Sandbox Code Playgroud)

一般来说,你应该override尽可能避免使用.

  • 答案很好,除了最后一句.没有编写`override`没有任何优势,它有助于使代码更清晰,更安全,以备将来添加.一些保存的击键不值得阻碍(你的例子是一个很好的例子,不应该编写代码). (8认同)
  • @0__ 哈哈)))。我明白那个。我不确定您是否理解我或 sschaef 写给您的评论。请读几遍你的精彩答案的最后一句话,并尝试思考它是如何被其他人误解的。 (2认同)