Scala:'覆盖'的目的是什么?

时间:2013-04-19 17:33:10

标签: scala

我不确定override关键字在scala中的用途是什么。如果我有

trait Shape { def foo(v: Int) }
class Triangle extends Shape { override def foo(v: Int) {} }

它的行为(显然至少)与没有override的行为完全相同。

3 个答案:

答案 0 :(得分:53)

如果您要在示例中实现抽象方法,则不必添加override修饰符。

但是,如果您想要override来自超类的具体方法,则需要override修饰符。这是为了避免混合成分可能发生的意外覆盖 - 在某些重构期间混入特性可能很容易引入一个方法定义,可以通过类主体中定义的方法覆盖,因此需要明确说明a方法是一种覆盖。

答案 1 :(得分:26)

在您的特定情况下,您从axel22获得了全面的答案。我只想补充一点,至少有一个案例可能会遇到覆盖修饰符。关键字也可以与特征方法一起使用。

想象一下,你有一个抽象类:

abstract class Writer {
  def print(str: String)
}

及其在控制台上打印的具体实现

class ConsoleWriter extends Writer {
  def print(str: String) = println(str)
}

现在,您要创建一个将修改其行为的特征。请看以下实现:

trait Uppercase extends Writer {
  abstract override def print(str: String) = 
    super.print(str.toUpperCase())
}

请注意,方法有两个修饰符:abstract和override。这仅适用于特征,这意味着特征必须混合到某个具有相关方法具体定义的类中

根据上面的定义,你可以这样做:

val writer = new ConsoleWriter with Uppercase
writer.print("abc")

将产生结果

ABC

同样徒劳无功,你可以添加更多特质:

trait WithSpaces extends Writer {
  abstract override def print(str: String) = 
    super.print(str.split("").mkString(" ").tail)
}

现在打电话

val writer = new ConsoleWriter with Uppercase with WithSpaces
writer.print("abc")
你会看到:

A B C

在traits中使用override修饰符是scala中的一个显着特征,你不会在java中看到它。

答案 2 :(得分:7)

用于错误检查。
假设你有

trait Shape { def foo(v: Int) = 1 }
class Triangle extends Shape { override def foo(v: Int) = 2 }

然后将Shape更改为

trait Shape { def bar(v: Int) = 1 }

在这种情况下,“覆盖”会告诉您foo中的Triangle会覆盖任何内容。

另见:
http://docs.oracle.com/javase/7/docs/api/java/lang/Override.html
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final