Scala:用val覆盖def

时间:2014-06-09 20:08:12

标签: 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 Item{}

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

1 个答案:

答案 0 :(得分:9)

由于price中的descriptionItem是抽象的,因此您无需使用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