2014-01-20 3 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' * только *, когда он фактически переопределяет унаследованную реализацию. –

+0

@ RandallSchulz почему? Вы можете объяснить ? – MadSeb

+0

Есть случаи, когда вы можете использовать ключевое слово 'override', хотя ничто не переопределяется. Я нахожу это вводящим в заблуждение и требую, чтобы это не было сделано в нашей базе кода. –

ответ

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 
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 даже абстрактные методы только в случае. Это зависит от соглашений в проекте.

ключевое слово для абстрактных методов дает читателю понять, что этот метод определен в родительском классе/признаке, не обращаясь к объявлению родительского класса.

Смежные вопросы