SaK*_*Kou 1 inheritance overriding scala
我正在阅读此链接中的示例http://www.tutorialspoint.com/scala/scala_classes_objects.htm 示例:
class Point(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("Point x location : " + x);
println ("Point y location : " + y);
}
}
class Location(override val xc: Int, override val yc: Int,
val zc :Int) extends Point(xc, yc){
var z: Int = zc
def move(dx: Int, dy: Int, dz: Int) {
x = x + dx
y = y + dy
z = z + dz
println ("Point x location : " + x);
println ("Point y location : " + y);
println ("Point z location : " + z);
}
}
object Test {
def main(args: Array[String]) {
val loc = new Location(10, 20, 15);
// Move to a new location
loc.move(10, 10, 5);
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白类位置构造函数中 override 关键字的作用!为什么要提到它,因为我们在这里有一个扩展?谢谢 !
给定的
scala> class A(val a: Int)
defined class A
Run Code Online (Sandbox Code Playgroud)
如果您尝试这样定义B:
scala> class B(val a: Int) extends A(a)
<console>:11: error: overriding value a in class A of type Int;
value a needs `override' modifier
class B(val a: Int) extends A(a)
Run Code Online (Sandbox Code Playgroud)
编译器抱怨,因为看起来您正在尝试a在类中定义一个成员,B并且它已经通过继承(来自A)存在于那里。override在这种情况下,您需要添加以明确您的意图:
scala> class B(override val a: Int) extends A(a)
defined class B
Run Code Online (Sandbox Code Playgroud)
更具体地说,override如果您要覆盖抽象成员,则不必提供:
scala> trait A { def a: Int }
defined trait A
scala> class B(override val a: Int) extends A
defined class B
scala> class B(val a: Int) extends A
defined class B
Run Code Online (Sandbox Code Playgroud)
但是,为了避免在混合特征时意外覆盖,Scala 通过要求明确的override.
考虑这个例子:
这里没有问题:
scala> trait A { def a: Int = 1 }
defined trait A
scala> class B
defined class B
scala> new B with A
res0: B with A = $anon$1@3e29739a
Run Code Online (Sandbox Code Playgroud)
您已免于歧义:
scala> trait A { def a: Int = 1 }
defined trait A
scala> class B { def a: Int = 2 }
defined class B
scala> new B with A
<console>:13: error: <$anon: B with A> inherits conflicting members:
method a in class B of type => Int and
method a in trait A of type => Int
(Note: this can be resolved by declaring an override in <$anon: B with A>.)
new B with A
^
Run Code Online (Sandbox Code Playgroud)
手动解决冲突:
scala> trait A { def a: Int = 1 }
defined trait A
scala> class B { def a: Int = 2 }
defined class B
scala> new B with A { override val a = super[B].a }
res6: B with A{val a: Int} = $anon$1@76f6896b
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
806 次 |
| 最近记录: |