|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.07.2017, 17:24 | #1 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
Инициализация наследованного поля и проектирование иерархии для стратегии
Я строю такую иерархию классов:
Код:
Код:
Как правильно определить этот конструктор? Кроме того, в БД сотрудники трех типов имеют одни и те же поля, поэтому их надо инициализировать по одному алгоритму. Где определить этот алгоритм? В отдельной функции init() базового класса? В конструкторе базового класса? Далее я пишу сервис для расчета зарплаты, внутри которого используется паттерн Стратегия. Как передавать сотрудников в метод calculate() стратегии? Как ссылки на баазовый класс? |
04.07.2017, 17:43 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,493
|
Наследуется, но определена не в этом классе.
Сделайте конструктор AbstractEmployee и передавайте id туда из конструктора Employee (и всех остальных). Что делает бессмысленным использования трех разных классов. Как ссылки на базовый класс. Если не придумаете какие методы должны быть виртуальными, то опять возникнет вопрос "зачем нужны разные классы". Последний раз редактировалось waleri; 04.07.2017 в 17:47. |
04.07.2017, 18:10 | #3 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
>Что делает бессмысленным использования трех разных классов.
Мне нужно реализовать расчет зарплаты для сотрудников разных типов. ЗП для Employee расчитывается просто, и формула расчета здесь не важна. ЗП для Manager и Sales расчитывается как маленький коэффициент (0.004 и 0.005), умноженный на суммарную зарплату всех его подчиненных. То есть для расчета ЗП, например, Manager, нужно вычислить его ЗП без прибавки, а затем подсчитать ЗП всех его подчиненных. Можно хранить в классе Manager список из всех его подчиненных, и у каждого вызвать метод вычисления ЗП при суммировании. Итого расчет ЗП для Manager состоит из двух этапов: 1) Расчет ЗП без прибавки как для Employee 2) Расчет прибавки за подчиненных Выглядит как вызов виртуального метода базового класса, который вычисляет ЗП без прибавки, и добавление к нему экстра ЗП от подчиненных. То есть в виртуальном методе расчета ЗП Manager вызывается виртуальный метод базового класса, а затем добавляется прибавка. Сначала я выстроил линейную иерархию классов с виртуальными методами, но мне посоветовали писать сервис расчета ЗП со стратегией внутри. Вот и хочу разобраться. >Как ссылки на базовый класс. Если не придумаете какие методы должны быть виртуальными, то опять возникнет вопрос "зачем нужны разные классы". У меня вот такая ерунда: Код:
|
04.07.2017, 18:28 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,493
|
Вам тут больше pattern visitor подойдет.
https://en.wikipedia.org/wiki/Visitor_pattern Если коротко, у AbstractSalaryCalculator есть три метода calculate - для каждого типа Employee. У каждого Employee метод calculate будет вызывать нужный метод AbstractSalaryCalculator. По сути, метод расчета у вас один, с разными параметрами - обычный employee это тот же менеджер, у которого коэффициент 1 и количество подчиненных 0 Самый простой способ, это вообще убрать AbstractSalaryCalculator и сделать просто calculate в каждом типе. |
04.07.2017, 20:19 | #5 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
>По сути, метод расчета у вас один, с разными параметрами - обычный employee это тот же менеджер, у которого коэффициент 1 и количество подчиненных 0
Да, верно. Я тоже заметил такое обобщение, но сложно придумать архитектуру, в которой это обобщение будет уместно. |
05.07.2017, 13:49 | #6 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Код:
Код:
Последний раз редактировалось alexzk; 05.07.2017 в 13:55. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Бот для онлайн стратегии | ArtGrek | Работа с сетью в Delphi | 0 | 05.08.2014 13:59 |
Реализация выигрышной стратегии для компьютера | makc56 | Паскаль, Turbo Pascal, PascalABC.NET | 13 | 18.05.2012 13:32 |
Инициализация статического поля | ИВэТэшка | Общие вопросы C/C++ | 2 | 23.09.2011 10:52 |
движок для стратегии | lamer69 | Свободное общение | 1 | 22.05.2011 01:16 |
Карта для стратегии | sincemix | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 5 | 21.07.2010 23:54 |