Можно ли иметь много абстрактных классов в вашем приложении?

9

Сначала мы хотели реализовать шаблон Стратегии с различными реализациями методов в общем интерфейсе. Они будут выбраны во время выполнения на основе пользовательских данных.

Как оказалось, у нас есть абстрактные классы, реализующие 3-5 общих методов, и только один метод остался для различной реализации, то есть Стратегия.

Обновление: Под многими абстрактными классами я имею в виду 6 различных функций высокого уровня, то есть 6 пакетов, и у каждого есть свой интерфейс + AbstractImpl + (серия Actual Impl).

Это плохой дизайн в любом случае?

Любые негативные мнения с точки зрения последующей расширяемости - я готовлюсь к рассмотрению кода / дизайна с пожилыми людьми.

Йосек
источник

Ответы:

8

Нет, это ни в коем случае не плохой дизайн. Это шаблонный метод .

Он предназначен для инкапсуляции изменяющегося поведения шага алгоритма, что, вероятно, имеет место в вашем сценарии. Шаблоны стратегии и шаблонного метода во многих случаях представляют собой сильную комбинацию . Возможно, у вас есть абстрактные стратегии в качестве фрейма и вы используете шаблонный шаблон для конкретных стратегий. Это довольно чисто.

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

сокол
источник
4

Нет, это может быть вполне нормально (в зависимости от деталей - трудно сказать больше с этим небольшим знанием о вашем конкретном случае). Прекрасно объединить реализации общих методов в абстрактном базовом классе.

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

Петер Тёрёк
источник
1

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

Марк Се
источник
0

Если абстрактные классы реализуют одни и те же методы с одинаковым содержимым, тогда зачем иметь несколько абстрактных классов?

Если они внедряют методы по-разному, то я не вижу проблемы.

Чтобы улучшить расширяемость, используйте интерфейсы, тогда это будет меньше проблем, если вы затем отбросите абстрактный класс (ы)

Jonno
источник