何时在Scala类中使用override?

时间:2017-04-23 21:02:38

标签: scala override

这是一个让我很困惑的例子。

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类中的抽象方法,它应该用" override"来装饰,我想。实际上,当我添加"覆盖"时,会发生错误。

对于xc,yc,为什么"覆盖"是一个nessesary?

我真的很困惑。

我有Python经验,而且Java经验很少。

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

1 个答案:

答案 0 :(得分:0)

  

对于xc,yc,为什么“覆盖”是一个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
  

为什么方法“移动”不需要“覆盖”?

因为Parent类中的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
}

如果签名相同,您可以使用aldo overrid den,这样当您调用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
}

示例调用move方法,

为父母,

scala> val point = new Point(1, 2)
point: Point = Point@66813e6e

scala> point.move()
parent::whatever

为了孩子,

scala> val location1 = new Location(1, 2, 3)
location1: Location = Location1@233db8e9

scala> location1.move()
child::whatever