在Scala中,有什么区别:
abstract class Car { def drive(distance: Integer) : Unit }
class BMW extends Car { def drive(distance: Integer) = println("I'm driving") }
和:
abstract class Car { def drive(distance: Integer) : Unit }
class BMW extends Car { override def drive(distance: Integer) = println("I'm driving") }
具体来说,override
关键字的确切效果是什么?
答案 0 :(得分:5)
在您的情况下没有,因为您没有在drive
中提供abstract class Car
方法的具体实现。
如下定义:
def drive(distance: Integer) : Unit
这些方法的行为类似于Java接口。具体而言,抽象类的任何具体实现者都必须定义这些方法的实现。
否则你甚至会收到错误。类似于:class BMW must be abstract
。在您的情况下,override
关键字是无用的,但如果方法确实有实现:
class BMW extends Car {def drive(distance: Integer) = println("blabla"); }
现在这需要覆盖扩展类:
class BMWX5 extends BMW { def drive(distance: Integer) = println("x5"); } // won't work
class BMWX5 extends BMW { override def drive(distance: Integer) = println("x5"); }// will compile
答案 1 :(得分:4)
override
非常有用:
abstract class Car { def drive(distance: Integer) : Unit }
没有override
:
abstract class BMW extends Car { def drive(distance: Int) = println("I'm driving") }
override
:
scala> abstract class BMW extends Car { override def drive(distance: Int) = println("I'm driving") }
<console>:8: error: method drive overrides nothing.
Note: the super classes of class BMW contain the following, non final members named drive:
def drive(distance: Integer): Unit
abstract class BMW extends Car { override def drive(distance: Int) = println("I'm driving") }
^
如果abstract
方法override
关键字不是那么有用,但为了以防万一,override
甚至是抽象方法也是一种很好的做法。这取决于项目中的惯例。
override
关键字使读者清楚地知道这个方法是在父类/特征中定义的,而不需要查看父类声明。