在覆盖抽象类的具体类中,`override`的作用是什么?

时间:2014-01-20 17:34:12

标签: scala override abstract

在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关键字的确切效果是什么?

2 个答案:

答案 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关键字使读者清楚地知道这个方法是在父类/特征中定义的,而不需要查看父类声明。