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

use*_*000 31 scala

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

trait Shape { def foo(v: Int) }
class Triangle extends Shape { override def foo(v: Int) {} }
Run Code Online (Sandbox Code Playgroud)

它表现得(显然至少)与没有完全相同override.

axe*_*l22 57

如果您正在实现示例中的抽象方法,则不必严格添加override修饰符.

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


rar*_*rry 27

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

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

abstract class Writer {
  def print(str: String)
}
Run Code Online (Sandbox Code Playgroud)

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

class ConsoleWriter extends Writer {
  def print(str: String) = println(str)
}
Run Code Online (Sandbox Code Playgroud)

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

trait Uppercase extends Writer {
  abstract override def print(str: String) = 
    super.print(str.toUpperCase())
}
Run Code Online (Sandbox Code Playgroud)

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

根据上面的定义,您可以:

val writer = new ConsoleWriter with Uppercase
writer.print("abc")
Run Code Online (Sandbox Code Playgroud)

这将产生结果

ABC

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

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

现在你打电话的时候

val writer = new ConsoleWriter with Uppercase with WithSpaces
writer.print("abc")
Run Code Online (Sandbox Code Playgroud)

你会看见:

ABC

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


Art*_*mGr 8

这是为了错误检查.
假设你有

trait Shape { def foo(v: Int) = 1 }
class Triangle extends Shape { override def foo(v: Int) = 2 }
Run Code Online (Sandbox Code Playgroud)

然后你将Shape改为

trait Shape { def bar(v: Int) = 1 }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"覆盖"将告诉您,fooin 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

  • 三次,覆盖的方法是否抽象无关紧要,可以随时间变化。界面更改后,改写有助于保持协调。 (2认同)
  • 三次,`特征形状{def bar(v:Int)}; class Triangle extended Shape {覆盖def foo(v:Int)= 2}`给出错误“方法foo覆盖不了任何内容”,它与bar是否抽象无关。 (2认同)