2017-04-23 36 views
1

这是一个令我困惑的例子。何时在Scala类中使用覆盖?

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 ("x 的坐标点 : " + x); 
     println ("y 的坐标点 : " + 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 ("x 的坐标点 : " + x); 
     println ("y 的坐标点 : " + y); 
     println ("z 的坐标点 : " + z); 
    } 
} 

为什么方法move并不需要一个override修改?它不是类Point中的抽象方法,我认为它应该用“覆盖”来装饰。实际上,当我添加“覆盖”时,会发生错误。

而对于xc,yc,为什么“覆盖”是一个nessesary?

我真的很困惑。

我有Python的经验和很少的Java经验。

任何帮助将不胜感激,谢谢!

+2

因为'move'不'Point'抽象?它只是一种方法。当你调用'myLocation.move()'时,除非你在你的子类中覆盖'',否则它会调用'Point.move()'。顺便说一下,移动和位置的移动签名完全不同,所以它不会被覆盖。 – prayagupd

回答

0

for xc, yc, why "override" is a nessesary?

不,不是必要的。在你的情况下,你在你的子类中再次使用val,这是没有必要的,因为你已经在父类中将它们定义为val(简单地从子类中删除VAL)

scala> class Point(val xc: Int, val yc: Int) {} 
defined class Point 

scala> class Location(xc: Int, yc: Int, val zc :Int) extends Point(xc, yc){} 
defined class Location 

Why the method "move" doesn't need an "override"?

因为你在父类move方法是不是abstract方法 或您的签名是在子类比父类不同。

例如。

abstract class Point(val xc: Int, val yc: Int) { 
    abstract def doWhatever() : Unit 
} 

class Location(xc: Int, yc: Int, val zc: Int) extends Point(xc, yc) { 
    override def doWhatever(): Unit = ??? // override is optional 
} 

你可以有醛overrid书房如果签名是一样的,所以,当你调用childClass.move(),调用重写的方法。

class Point(val xc: Int, val yc: Int) { 
    def move() = println("parent::whatever") 
} 

class Location(xc: Int, yc: Int, val zc: Int) extends Point(xc, yc) { 
    override def move() = println("child::whatever") //override is required 
} 

例如调用移动方法,

为父,

scala> val point = new Point(1, 2) 
point: Point = [email protected] 

scala> point.move() 
parent::whatever 

一个孩子,

scala> val location1 = new Location(1, 2, 3) 
location1: Location = [email protected] 

scala> location1.move() 
child::whatever 
+0

谢谢!我理解“移动”方法的解释。但是,对于xc和yc,我删除了“覆盖”,并且解释器告诉我“错误:在类Int中覆盖值xc; 值xc需要'覆盖'修饰符.....”。你可以进一步检查我的代码吗?非常感谢!! – Phil

+0

你是否从子类中删除'val',而不是父类? – prayagupd

+0

我懂了!非常感谢! – Phil