Пустой метод в абстрактный класс


У меня есть абстрактный класс, который имеет метод крюк для шаблонный метод. Не все классы, которые расширяют этот класс должен реализовать этот метод (на самом деле большинство не будет, но несколько). Таким образом, я объявил метод таким образом:

protected void applyExtraCriteria(Object extraCriteria) {

}

Она должна быть объявлена так:

protected abstract void applyExtraCriteria(Object extraCriteria);

Что бы считаться лучшей практики?



11185
8
задан 24 августа 2011 в 06:08 Источник Поделиться
Комментарии
5 ответов

Если вы не совсем уверены , что пустой метод тела-это хорошо для большинства подклассы, вы могли бы последовать примеру качели слушателей (например, WindowListener / WindowAdapter): сделайте методов ФОО класс реферат, но дают абстрактный класс под названием FooAdapter расширение Фу, который реализует методы с пустыми органами. Таким образом, вы документировать свои намерения: методы должны быть реализованы, но за счет расширения FooAdapter вы говорите, что вы хотите для большинства из них реализация по умолчанию (который, случается, имеют пустые тела методов).

Обновление: конечно, если вы можете использовать Java 8, вы можете оставить значение по умолчанию методы в интерфейсах, поэтому абстрактный класс не нужен.

8
ответ дан 25 августа 2011 в 06:08 Источник Поделиться

Я бы заявить, как это требуется по всем классам. Достаточно просто оставить пустую заглушку метода в подклассе.

10
ответ дан 24 августа 2011 в 06:08 Источник Поделиться

Я согласен с ответом IAbstract, но я хочу расширить его своими 2 цента.

Абстрактные базы не следует делать никаких предположений относительно того, или не производная дети "нужны" метод. Действительно, если он делает предположение, что детей совершенно необходимо.

Кроме того, обеспечивая пустой реализации в абстрактный базовый может быть детей, полагая, что это, в самом деле, некоторые по умолчанию реализация, которая на самом деле может сделать что-то. Вы могли бы иметь детей переопределяя метод с пустой реализацией просто потому, что они не хотят ничего делать!

(Я понимаю, что вы, возможно, напишу как базовых, так и ребенка, но я думаю, лучше всего мысленно разделить свои собственные роли. Когда вы пишете в базу, вы поставщик. Когда вы пишете ребенок, ты потребитель. В качестве поставщика, развивать базу таким образом, что имеют смысл для ваших потребителей.)

Сделать метод абстрактным. Пусть дети решают, что (если любой) реализация должна быть на каждом шаге алгоритм, следуя в духе шаблонного метода паттерн.

3
ответ дан 24 августа 2011 в 08:08 Источник Поделиться

Я думаю, что лучше различать два случая здесь:


  • Для шаблонный метод, я считаю, что лучше иметь пустой виртуальный
    метод в базовом классе. Если вы не нужно добавить любую функциональность
    просто игнорируйте эту часть, но вы должны добавить некоторый код, только если вам нужно. Это именно ваш случай.

  • Для открытого метода я считаю, что лучше иметь абстрактный метод в базовом классе. Это очень необычная ситуация, что ваш публичный метод не-ОП и в то же время вы не забудете его реализации.

3
ответ дан 25 августа 2011 в 07:08 Источник Поделиться

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

1
ответ дан 26 августа 2011 в 07:08 Источник Поделиться