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

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

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

0810fdbcdcc578effa05bbeb2bd70e72.png


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

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

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


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

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

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

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


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

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


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

I

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

II

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

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

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

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


Есть идеи, как в Java более элегантно решить этот вопрос?
  • Вопрос задан
  • 3400 просмотров
Пригласить эксперта
Ответы на вопрос 8
Shedal
@Shedal
Ваш второй вариант уже ближе к правильному. Не совсем понятно, почему вы хотите сделать методы статическими, я бы создавал объект класса внутри. Но возможно, вам действительно больше подходит статика.

По поводу доступа к приватным полям — эту проблему можно решить, например, создав event'ы во вспомогательном классе, и затем подписать на них методы основого класса.
Ответ написан
asm0dey
@asm0dey
Есть вариант написать класс на скале, например. В ней, если мне память не изменяет, есть множественное наследование.
Ответ написан
Комментировать
Arktos
@Arktos
Можно не добавлять геттеры и сеттеры, а использовать Reflection (методы getClass, class.getField, field.setAccessible, field.get, field.set)
Ответ написан
Комментировать
FreeTibet
@FreeTibet
dharma supplier
Java практически не знаю, но всегда думал, что в Jave принято решать такие вещи через интерфейсы.
public class MixedDict extends Dictionary implements Flagable
Ответ написан
phil_tsarik
@phil_tsarik
Возможно, такое подойдет:
в каждом классе Some_WithFlags держать объект FlagFunctioner. Класс FlagFunctioner должен иметь все необходимые public методы, чтобы работать с ним. плюс будут видны protected, если находятся в одном пакете.
В Some_WithFlags создать getter для FlagFunctioner, если надо его доступность извне.

Может быть вы и имели это ввиду под пунктом II, только я не понял о чем у вас там речь.
> Создаем методы в каждом классе и делегируем их в статический метод третьего класса со ссылкой на объект.
Ответ написан
leventov
@leventov
Можно подождать (1 год) Java 8 c дефолтными реализациями в интерфейсах :)
Ответ написан
serso
@serso
Во-первых, делегирование — правильное решение в данном случае (вы, по сути, скроете(инкапсулируете) дополнительный функционал)
Во-вторых, вы можете не создавать getter'ы для приватных полей, а явно передавать их делегату. Либо вы можете объявить getter'ы package protected и не бояться что-то кто может воспользоваться ими извне
Ответ написан
@relgames
Java Developer
Путей несколько.

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

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы