Отношения между базовыми и производными классами



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

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

минимальной зарплатой (которых будет представлять производный класс) получают минимально гарантированную зарплату плюс процент от их сделок. Мы разобьем наше обсуждение отношений между этими классами служащих на продуманную последовательность из пяти примеров:

 

1. В нашем первом примере мы создаем класс CommissionEmployee, который содержит в качестве закрытых элементов данных имя, фамилию, номер социальной страховки, комиссионную ставку (процент) и объем (т.е. общую сумму) продаж.

 

2. Второй пример определяет класс BasePlusCommissionEmployee, который

содержит в качестве закрытых элементов данных имя, фамилию, номер социальной страховки, комиссионную ставку, объем продаж и минимальную зарплату. Мы создадим этот класс, вручную написав каждую необходимую строчку кода, — вскоре мы увидим, что гораздо более эффективным будет создание этого класса просто путем наследования от класса CommissionEmployee.

 

Третий пример определяет новую версию класса 

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

 

4. Четвертый пример показывает, что если объявить данные класса СоmissionEmployee как protected, to новая версия класса BasePlusCommissionEmployee, производная от класса CommissionEmployee, может непосредственно обращаться к этим данным. Для этой демонстрации мы определяем новую версию класса CommissionEmployee с защищенными данными. Как версия BasePlusCommissionEmployee с наследованием, так и его версия без наследования обладают одинаковыми функциональными свойствами, но мы показываем, что версию с наследованием от класса CommissionEmployee создать и сопровождать значительно проще.

 

5. Обсудив удобства использования защищенных данных, мы создаем пятый пример, который снова делает элементы данных класса CommissionEmployee закрытыми в соответствии с принципами правильного конструирования программного обеспечения. Этот пример демонстрирует, что производный класс BasePlusCommissionEmployee может использовать открытые элемент-функции базового класса CommissionEmployee для манипуляции его закрытыми данными.

 

Создание и тестирование класса CommissionEmployee

Пример 1(не набирать)

 

 

Создание класса BasePlusCommissionEmployee без наследования

Пример 2(не набирать)

Обратите внимание на сходство между этим классом и классом CommissionEmployee; в этом примере мы пока не воспользуемся этим сходством.

 

Исследование сходства классов BasePlusCommissionEmployee

И CommissionEmployee

Обратите внимание, как много в классе BasePlusCommissionEmployee кода, схожего, если не полностью совпадающего, с кодом класса CommissionEmployee. Например, в классе BasePlusCommissionEmployee закрытые элементы данных firstName и lastName и элемент-функции setFirstName, getFirstName, setLastName и getLastName идентичны имеющимся в классе CommissionEmployee. Как класс BasePlusCommissionEmployee, так и класс CommissionEmployee содержат также закрытые элементы данных socialSecurityNumber, comissionRate и gross Sales вместе с set и get-функциями для манипуляции этими элементами. Кроме того, конструктор BasePlusCommissionEmployee почти идентичен конструктору CommissionEmployee за исключением того, что конструктор BasePlusCommissionEmployee устанавливает еще baseSalary. Другими дополнениями в классе BasePlusCommissionEmployee являются закрытый элемент данных baseSalary и элемент-функции setBaseSalary и getBaseSalary. Элемент-функция print класса BasePlusCommissionEmployee идентична определенной в классе CommissionEmployee за исключением того, что print из BasePlusCommissionEmployee выводит еще значение элемента данных baseSalary. Мы буквально скопировали код из класса CommissionEmployee и вставили его в класс BasePlusCommissionEmployee, а затем модифицировали 

последний, включив в него зарплату и функции, манипулирующие этой зарплатой.

Этот подход «копировать/вставить» часто поглощает много времени и не гарантирован от ошибок. Что еще хуже, он может размножать в системе копии одного и того же кода, превращая его сопровождение в кошмар. Существует ли способ, не дублируя код, «ассимилировать» элементы данных и элемент-функции класса таким образом, чтобы они становились составляющими других классов? В нескольких следующих разделах мы, воспользовавшись наследованием, сделаем именно это.


Дата добавления: 2018-08-06; просмотров: 226; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!