这是一个让我很困惑的例子。
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经验很少。
任何帮助将不胜感激,谢谢!
答案 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