2011-04-13 3 views
23

Полезно ли использовать ключевое слово override при реализации абстрактных методов, определенных в чертах?Использование ключевого слова override при реализации абстрактных методов

trait Tooth { 
    def ache(): Unit 
} 

class Molar extends Tooth { 
    override def ache(): Unit = {} 
} 

В приведенном выше примере я понимаю, что ключевое слово override является необязательным; но целесообразно ли это? С какой стороны я должен упасть?

+0

аргументированный ... –

+2

@ Kim - Как, точно? –

ответ

25

override делает одну вещь для вас там: при удалении Tooth.ache, но не ее реализации позже, вы получите ошибки компилятора. В частности, это приводит к тому, что реализации в некотором смысле «Tooth» (написанные вами или другими) «близки» к Tooth, а именно, что устаревшие методы исчезают (или, по крайней мере, пересматриваются).

Это может быть или не быть желательным.

+11

OTOH, если кто-нибудь когда-нибудь введет реализацию 'ache' внутри' Tooth', стремясь предоставить окончательное решение, он даже не знает, что в коде все еще будут старые реализации. –

+2

Я согласен с этим. Я видел многочисленные примеры мертвого кода, потому что абстрактный метод был переименован. –

15

Лично я, когда вижу

override def whatever() 

первое, что я думаю, что это, «Интересно, как это должно было вести себя раньше?»

Так как это бесполезная мысль, если это был абстрактный метод, я нахожу его еще более кратким и более безопасным, чтобы его оставить.

7

Я всегда использую его, чтобы указать член, который был объявлен на суперклассах, даже если он абстрактный.

+1

Я считаю, что это лучший ответ (безусловно), но он ограничивает себя слишком коротким. Я бы добавил, что переопределение имеет очень четкое * намерение * из обычного метода (новый метод только добавляет поведение, переопределение его потенциально меняет). И всякий раз, когда требуется различное намерение, лучше всего сделать это явным. – rsenna

+1

OTOH, если кто-то когда-нибудь поставит проблему боли внутри Зуба, стремясь предоставить окончательное окончательное решение, он даже не знает, что в коде все еще будут старые реализации. –

12

Обычно я не использую переопределение при реализации абстрактного метода. Это не так, но избыточно, и я предпочитаю, чтобы мой код был как можно короче, сохраняя ясность. Но я понимаю, что это не четкий случай.

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