1 / 1 / 2
Регистрация: 03.11.2013
Сообщений: 50
|
|
1 | |
Про вызов виртуального метода из конструктора20.02.2016, 12:35. Показов 935. Ответов 6
Метки нет Все метки)
(
Знаю, что нельзя вызывать виртуальный метод из конструктора, но не знаю как сделать иначе.
Есть класс Сотрудник с почасовой оплатой, в конструкторе получаю почасовую ставку для рассчета зарплаты. Но метод рассчета, который получает в качестве параметра эту почасовая ставку - виртуальный, так как для разных категорий сотрудников своя методика рассчета. Логично было бы сразу при создании экземпляра рассчитать зарплату и сохранить её в свойстве Payment. То есть как раз вызвать виртуальный метод в конструкторе, и все работает неправильно. Можно, конечно, вызывать метод в геттере свойства Payment, но тогда каждый раз при обращении зарплата будет рассчитываться заново. Тоже как-то неочень. Как ещё можно решить эту задачу?
0
|
|
20.02.2016, 12:35 | |
Ответы с готовыми решениями:
6
Вызов виртуального метода при создании Вызов виртуального метода класса наследника из вектора Вызов виртуального метода базового класса из указателя производного |
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
20.02.2016, 13:28 | 2 |
Нет, не логично. Каждый метод должен заниматься своим делом. У конструктора дело -- создание верного объекта.
Расчёт зарплаты должен производиться в методе расчёта зарплаты.
0
|
1 / 1 / 2
Регистрация: 03.11.2013
Сообщений: 50
|
|||||||||||
20.02.2016, 15:01 [ТС] | 3 | ||||||||||
mporro, спасибо за ответ, но вы наверное меня не правильно поняли. Расчет зарплаты реализован в отдельном методе. Вопрос в том, откуда его вызвать, чтобы инициализировать поле payment.
Вот упрощенный базовый класс:
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
||||||
20.02.2016, 15:21 | 4 | |||||
Elfin83
Если у Вас экземпляр HourlyPaymentEmployee рассчитывает зарплату в отдельном методе, то зачем Вы её сохраняете во внутреннее поле? Добавлено через 12 минут Как-то так должно выглядеть
0
|
1 / 1 / 2
Регистрация: 03.11.2013
Сообщений: 50
|
|
20.02.2016, 15:28 [ТС] | 5 |
mporro, мне нужна возможность извне получать зарплату каждого сотрудника, для этого в классе свойство Payment, как не используя поля передать это значение геттеру?
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
20.02.2016, 16:03 | 6 |
Так вот её и можно получить, вызвав метод
calculatePayment() , который является частью контракта Employee. A свойство payment совсем выкинуть, обращаться через только через метод.P.S. Если уже настолько нарушена архитектура, что сделать честно нельзя, то вызывайте из акцессора get метод calculatePayment. Сам calculatePayment тогда нужно сделать закрытым, чтобы не испортить интерфейс. В C# же можно как в Java переопределить private метод, да?
1
|
1 / 1 / 2
Регистрация: 03.11.2013
Сообщений: 50
|
|
20.02.2016, 18:42 [ТС] | 7 |
mporro, всё, дошло, спасибо!
0
|
20.02.2016, 18:42 | |
Помогаю со студенческими работами здесь
7
Вызов конструктора из конструктора и проверка правильности передаваемых параметров Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода Вызов конструктора из конструктора - ошибка Переопределение виртуального метода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |