我不确定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中看到它.
这是为了错误检查.
假设你有
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)
在这种情况下,"覆盖"将告诉您,foo
in 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
归档时间: |
|
查看次数: |
17345 次 |
最近记录: |