我不确定override
关键字在scala中的用途是什么。如果我有
trait Shape { def foo(v: Int) }
class Triangle extends Shape { override def foo(v: Int) {} }
它的行为(显然至少)与没有override
的行为完全相同。
答案 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