This section reexamines the CommissionEmployee
-BasePlusCommissionEmployee
hierarchy that we explored throughout Section G.4. Now we use an abstract method and polymorphism to perform payroll calculations based on an enhanced employee inheritance hierarchy that meets the following requirements:
A company pays its employees on a weekly basis. The employees are of four types: Salaried employees are paid a fixed weekly salary regardless of the number of hours worked, hourly employees are paid by the hour and receive overtime pay (i.e., 1.5 times their hourly salary rate) for all hours worked in excess of 40 hours, commission employees are paid a percentage of their sales and base-salaried commission employees receive a base salary plus a percentage of their sales. For the current pay period, the company has decided to reward salaried-commission employees by adding 10% to their base salaries. The company wants to write an application that performs its payroll calculations polymorphically.
We use abstract
class Employee
to represent the general concept of an employee. The classes that extend Employee
are SalariedEmployee
, CommissionEmployee
and HourlyEmployee
. Class BasePlusCommissionEmployee
—which extends CommissionEmployee
—represents the last employee type. The UML class diagram in Fig. G.14 shows the inheritance hierarchy for our polymorphic employee-payroll application. Abstract class name Employee
is italicized—a convention of the UML.
Abstract superclass Employee
declares the “interface” to the hierarchy—that is, the set of methods that a program can invoke on all Employee
objects. We use the term “interface” here in a general sense to refer to the various ways programs can communicate with objects of any Employee
subclass. Be careful not to confuse the general notion of an “interface” with the formal notion of a Java interface, the subject of Section G.12. Each employee, regardless of the way his or her earnings are calculated, has a first name, a last name and a social security number, so private
instance variables firstName
, lastName
and socialSecurityNumber
appear in abstract superclass Employee
.
The following sections implement the Employee
class hierarchy of Fig. G.14. The first section implements abstract superclass Employee
. The next four sections each implement one of the concrete classes. The last section implements a test program that builds objects of all these classes and processes those objects polymorphically.