Задать вопрос

Решение задачи без множественного наследования?

В системе присутствует 2 основных класса объектов: документы и справочники,

те в свою очередь наследуются от некоего общего базового класса.

0810fdbcdcc578effa05bbeb2bd70e72.png


Проблема появилась в тот момент, когда некоторым из потомков DICTIONARY и DOCUMENT

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

Причем этому функционалу было достаточно набора данных имеющемся в BASE


Тут можно сказать, что функционал для работы с флагами можно внести в BASE и забыть.

С этим есть проблема:

В иерархии между базовым классом и объектами использующие флаги есть много документов, которым этот функционал не нужен.

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


В С++ можно было бы на нужном нам уровне иерархии привить нужные методы.

В Java же приходится изгаляться.


Предлагаемые решения:

I

Копируем методы для работы с классами в каждую ветку иерархии — копипаст. Некрасиво, источник потенциальных ошибок.

II

Создаем методы в каждом классе и делегируем их в статический метод третьего класса со ссылкой на объект.

Тут могут быть неудобства. Метод не будет иметь доступа к private и, возможно, protected свойствам.

(frend class вроде как в Java нет, поправьте меня, если неправ)

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


Есть идеи, как в Java более элегантно решить этот вопрос?
  • Вопрос задан
  • 3400 просмотров
Подписаться 4 Оценить Комментировать
Ответ пользователя relgames К ответам на вопрос (8)
@relgames
Java Developer
Путей несколько.

Можно добавить интерфейс Flaggable и реализовать его в каждом классе через общий делегат (ваш метод 2)

Можно сделать класс FlagWrapper, который будет принимать на вход объект типа Base — тогда вообще не надо менять существующие классы, а сделать завязку на FlagWrapper
Ответ написан
Комментировать