2014-01-20 30 views
2

在Scala中,有什麼區別:擴展抽象類的具體類中的override是什麼效果?

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關鍵字的確切療效?

+1

我要求我的程序員在實際上覆蓋繼承的實現時使用'override' * only *。 –

+0

@RandallSchulz爲什麼?你可以解釋嗎 ? – MadSeb

+0

有些情況下,即使沒有被覆蓋,你也可以使用'override'關鍵字。我發現有誤導性,並且要求不要在我們的代碼庫中完成。 –

回答

5

在你的情況下沒有,因爲你沒有提供abstract class Cardrive方法的具體實現。

當這樣定義的:

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 
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抽象方法的關鍵字使讀者明白,此方法是在父類/ trait中定義的,無需查看父類聲明。