Question
Java - (Payroll System Modification) Modify the payroll system of Figs. 10.4 10.9 to include an additional Employee subclass PieceWorker that represents an employee whose
Java - (Payroll System Modification) Modify the payroll system of Figs. 10.4 10.9 to include an additional Employee subclass PieceWorker that represents an employee whose pay is based on the number of pieces of merchandise produced. Class PieceWorker should contain private instance variables wage (to store the employees wage per piece) and pieces (to store the number of pieces produced). Provide a concrete implementation of method earnings in class PieceWorker that calculates the employees earnings by multiplying the number of pieces produced by the wage per piece. Create an array of Employee variables to store references to objects of each concrete class in the new Employee hierarchy. For each Employee, display its string representation and earnings.
Sample Output:
Employees processed polymorphically: salaried employee: John Smith social security number: 111-11-1111 weekly salary: $800.00
earned $800.00
hourly employee: Karen Price social security number: 222-22-2222 hourly wage: $16.75; hours worked: 40.00 earned $670.00
commission employee: Sue Jones social security number: 333-33-3333 gross sales: $10,000.00; commission rate: 0.06 earned $600.00
base-salaried commission employee: Bob Lewis social security number: 444-44-4444 gross sales: $5,000.00; commission rate: 0.04; base salary: $300.00 earned $500.00
piece worker: Rick Bridges social security number: 555-55-5555 wage per piece: $2.25; pieces produced: 400 earned $900.00
Problem 2.
(Accounts Payable System Modification) In this exercise, we modify the accounts payable application of Figs. 10.1110.15 (youre your book) to include the complete functionality of the payroll application. The application should still process two Invoice objects, but now should process one object of each of the four Employee subclasses (Figs. 10.5 10.8). If the object currently being processed is a BasePlusCommissionEmployee, the application should increase the BasePlusCommissionEmployees base salary by 10%. Finally, the application should output the payment amount for each object.
Complete the following steps to create the new application: a) Modify classes HourlyEmployee and CommissionEmployee to place them in the Payable hierarchy as subclasses of the version of Employee that implements Payable (Fig. 10.13). [Hint: You should introduce a getPaymentAmount method in each subclass so that the class satisfies its inherited contract with interface Payable. The getPaymentAmount can call earning to calculate the payable salary.] b) Modify class BasePlusCommissionEmployee such that it extends the version of class CommissionEmployee created in Part a. c) Modify PayableInterfaceTest to polymorphically process two Invoices, one SalariedEmployee, one HourlyEmployee, one CommissionEmployee and one BasePlusCommissionEmployee.
First output a string representation of each Payable object. Next, if an object is a BasePlusCommissionEmployee, increase its base salary by 10%. Finally, output the payment amount for each Payable object.
Sample Output:
Invoices and Employees processed polymorphically:
invoice: part number: 01234 (seat) quantity: 2 price per item: $375.00 payment due: $750.00
invoice: part number: 56789 (tire) quantity: 4 price per item: $79.95 payment due: $319.80
salaried employee: John Smith social security number: 111-11-1111
weekly salary: $800.00
payment due: $800.00
hourly employee: Karen Price social security number: 222-22-2222 hourly wage: $16.75; hours worked: 40.00 payment due: $670.00
commission employee: Sue Jones social security number: 333-33-3333 gross sales: $10,000.00; commission rate: 0.06 payment due: $600.00
base-salaried commission employee: Bob Lewis social security number: 444-44-4444 gross sales: $5,000.00; commission rate: 0.04; base salary: $300.00 new base salary with 10% increase is: $330.00 payment due: $530.00
Problem 3. Add Class PieceWorker employee in the new hierarchy (the one from problem 2).
Problem 1 Tips:
The PieceWorker constructor should call the superclass Employee constructor to initialize the employees name.
The number of pieces produced should be greater than or equal to 0. Place this logic in the constructor and in the set method for the pieces variable.
The wage should be greater than or equal to 0. Place this logic in the constructor and in the set method for the wage variable.
The main method must explicitly create a new PieceWorker object and assign it to an element of the employees array.
Every class that implements interface Payable must declare a method called getPaymentAmount.
Class BasePlusCommissionEmployee must use its superclasss getPaymentAmount method along with its own base salary to calculate its total earnings.
Use the instanceof operator in PayableInterfaceTest to determine whether each object is a BasePlusCommissionEmployee object.
___
JAVA FILES REQUIRED:
PROBLEM 1 FILES:
// Problem 1: BasePlusCommissionEmployee.java // BasePlusCommissionEmployee class extends CommissionEmployee.
public class BasePlusCommissionEmployee extends CommissionEmployee { private double baseSalary; // base salary per week
// six-argument constructor public BasePlusCommissionEmployee( String first, String last, String ssn, double sales, double rate, double salary ) { super( first, last, ssn, sales, rate ); setBaseSalary( salary ); // validate and store base salary } // end six-argument BasePlusCommissionEmployee constructor
// set base salary public void setBaseSalary( double salary ) { baseSalary = ( salary < 0.0 ) ? 0.0 : salary; // non-negative } // end method setBaseSalary
// return base salary public double getBaseSalary() { return baseSalary; } // end method getBaseSalary
// calculate earnings; override method earnings in CommissionEmployee public double earnings() { return getBaseSalary() + super.earnings(); } // end method earnings
// return String representation of BasePlusCommissionEmployee object public String toString() { return String.format( "%s %s; %s: $%,.2f", "base-salaried", super.toString(), "base salary", getBaseSalary() ); } // end method toString } // end class BasePlusCommissionEmployee
___
// Problem 1: CommissionEmployee.java // CommissionEmployee class extends Employee.
public class CommissionEmployee extends Employee { private double grossSales; // gross weekly sales private double commissionRate; // commission percentage
// five-argument constructor public CommissionEmployee( String first, String last, String ssn, double sales, double rate ) { super( first, last, ssn ); setGrossSales( sales ); setCommissionRate( rate ); } // end five-argument CommissionEmployee constructor
// set commission rate public void setCommissionRate( double rate ) { commissionRate = ( rate > 0.0 && rate < 1.0 ) ? rate : 0.0; } // end method setCommissionRate
// return commission rate public double getCommissionRate() { return commissionRate; } // end method getCommissionRate
// set gross sales amount public void setGrossSales( double sales ) { grossSales = ( sales < 0.0 ) ? 0.0 : sales; } // end method setGrossSales
// return gross sales amount public double getGrossSales() { return grossSales; } // end method getGrossSales
// calculate earnings; override abstract method earnings in Employee public double earnings() { return getCommissionRate() * getGrossSales(); } // end method earnings
// return String representation of CommissionEmployee object public String toString() { return String.format( "%s: %s %s: $%,.2f; %s: %.2f", "commission employee", super.toString(), "gross sales", getGrossSales(), "commission rate", getCommissionRate() ); } // end method toString } // end class CommissionEmployee
___
// Problem 1: Employee.java // Employee abstract superclass.
public abstract class Employee { private String firstName; private String lastName; private String socialSecurityNumber;
// three-argument constructor public Employee( String first, String last, String ssn ) { firstName = first; lastName = last; socialSecurityNumber = ssn; } // end three-argument Employee constructor
// set first name public void setFirstName( String first ) { firstName = first; } // end method setFirstName
// return first name public String getFirstName() { return firstName; } // end method getFirstName
// set last name public void setLastName( String last ) { lastName = last; } // end method setLastName
// return last name public String getLastName() { return lastName; } // end method getLastName
// set social security number public void setSocialSecurityNumber( String ssn ) { socialSecurityNumber = ssn; // should validate } // end method setSocialSecurityNumber
// return social security number public String getSocialSecurityNumber() { return socialSecurityNumber; } // end method getSocialSecurityNumber
// return String representation of Employee object public String toString() { return String.format( "%s %s social security number: %s", getFirstName(), getLastName(), getSocialSecurityNumber() ); } // end method toString
// abstract method overridden by subclasses public abstract double earnings(); // no implementation here } // end abstract class Employee
___
// Problem 1: HourlyEmployee.java // HourlyEmployee class extends Employee.
public class HourlyEmployee extends Employee { private double wage; // wage per hour private double hours; // hours worked for week
// five-argument constructor public HourlyEmployee( String first, String last, String ssn, double hourlyWage, double hoursWorked ) { super( first, last, ssn ); setWage( hourlyWage ); // validate and store hourly wage setHours( hoursWorked ); // validate and store hours worked } // end five-argument HourlyEmployee constructor
// set wage public void setWage( double hourlyWage ) { wage = ( hourlyWage < 0.0 ) ? 0.0 : hourlyWage; } // end method setWage
// return wage public double getWage() { return wage; } // end method getWage
// set hours worked public void setHours( double hoursWorked ) { hours = ( ( hoursWorked >= 0.0 ) && ( hoursWorked <= 168.0 ) ) ? hoursWorked : 0.0; } // end method setHours
// return hours worked public double getHours() { return hours; } // end method getHours
// calculate earnings; override abstract method earnings in Employee public double earnings() { if ( getHours() <= 40 ) // no overtime return getWage() * getHours(); else return 40 * getWage() + ( getHours() - 40 ) * getWage() * 1.5; } // end method earnings
// return String representation of HourlyEmployee object public String toString() { return String.format( "hourly employee: %s %s: $%,.2f; %s: %,.2f", super.toString(), "hourly wage", getWage(), "hours worked", getHours() ); } // end method toString } // end class HourlyEmployee
___
// Problem 1: PayrollSystemTest.java // Employee hierarchy test program.
public class PayrollSystemTest { public static void main( String args[] ) { // create five-element Employee array Employee employees[] = new Employee[ 5 ];
// initialize array with Employees employees[ 0 ] = new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 ); employees[ 1 ] = new HourlyEmployee( "Karen", "Price", "222-22-2222", 16.75, 40 ); employees[ 2 ] = new CommissionEmployee( "Sue", "Jones", "333-33-3333", 10000, .06 ); employees[ 3 ] = new BasePlusCommissionEmployee( "Bob", "Lewis", "444-44-4444", 5000, .04, 300 ); /* create a PieceWoker object and assign it to employees[ 4 ] */
System.out.println( "Employees processed polymorphically: " ); // generically process each element in array employees for ( Employee currentEmployee : employees ) { System.out.println( currentEmployee ); // invokes toString System.out.printf( "earned $%,.2f ", currentEmployee.earnings() ); } // end for } // end main } // end class PayrollSystemTest
___
// Problem 1: PieceWorker.java // PieceWorker class extends Employee.
public class PieceWorker extends Employee { /* declare instance variable wage */ /* declare instance variable pieces */
// five-argument constructor public PieceWorker( String first, String last, String ssn, double wagePerPiece, int piecesProduced ) { /* write code to initialize a PieceWorker */ } // end five-argument PieceWorker constructor
// set wage /* write a set method that validates and sets the PieceWorker's wage */
// return wage /* write a get method that returns the PieceWorker's wage */
// set pieces produced /* write a set method that validates and sets the number of pieces produced */
// return pieces produced /* write a get method that returns the number of pieces produced */
// calculate earnings; override abstract method earnings in Employee public double earnings() { /* write code to return the earnings for a PieceWorker */ } // end method earnings
// return String representation of PieceWorker object public String toString() { /* write code to return a string representation of a PieceWorker */ } // end method toString } // end class PieceWorker
___
// Problem 1: SalariedEmployee.java // SalariedEmployee class extends Employee.
public class SalariedEmployee extends Employee { private double weeklySalary;
// four-argument constructor public SalariedEmployee( String first, String last, String ssn, double salary ) { super( first, last, ssn ); // pass to Employee constructor setWeeklySalary( salary ); // validate and store salary } // end four-argument SalariedEmployee constructor
// set salary public void setWeeklySalary( double salary ) { weeklySalary = salary < 0.0 ? 0.0 : salary; } // end method setWeeklySalary
// return salary public double getWeeklySalary() { return weeklySalary; } // end method getWeeklySalary
// calculate earnings; override abstract method earnings in Employee public double earnings() { return getWeeklySalary(); } // end method earnings
// return String representation of SalariedEmployee object public String toString() { return String.format( "salaried employee: %s %s: $%,.2f", super.toString(), "weekly salary", getWeeklySalary() ); } // end method toString } // end class SalariedEmployee
___
PROBLEM 2 FILES:
___
// Problem 2: Employee.java // Employee abstract superclass implements Payable.
public abstract class Employee implements Payable { private String firstName; private String lastName; private String socialSecurityNumber;
// three-argument constructor public Employee( String first, String last, String ssn ) { firstName = first; lastName = last; socialSecurityNumber = ssn; } // end three-argument Employee constructor
// set first name public void setFirstName( String first ) { firstName = first; } // end method setFirstName
// return first name public String getFirstName() { return firstName; } // end method getFirstName
// set last name public void setLastName( String last ) { lastName = last; } // end method setLastName
// return last name public String getLastName() { return lastName; } // end method getLastName
// set social security number public void setSocialSecurityNumber( String ssn ) { socialSecurityNumber = ssn; // should validate } // end method setSocialSecurityNumber
// return social security number public String getSocialSecurityNumber() { return socialSecurityNumber; } // end method getSocialSecurityNumber
// return String representation of Employee object public String toString() { return String.format( "%s %s social security number: %s", getFirstName(), getLastName(), getSocialSecurityNumber() ); } // end method toString
// abstract method overridden by subclasses public abstract double earnings(); // no implementation here // Note: We do not implement Payable method getPaymentAmount here so // this class must be declared abstract to avoid a compilation error. } // end abstract class Employee
___
// Problem 2: Invoice.java // Invoice class implements Payable.
public class Invoice implements Payable { private String partNumber; private String partDescription; private int quantity; private double pricePerItem;
// four-argument constructor public Invoice( String part, String description, int count, double price ) { partNumber = part; partDescription = description; setQuantity( count ); // validate and store quantity setPricePerItem( price ); // validate and store price per item } // end four-argument Invoice constructor
// set part number public void setPartNumber( String part ) { partNumber = part; } // end method setPartNumber
// get part number public String getPartNumber() { return partNumber; } // end method getPartNumber
// set description public void setPartDescription( String description ) { partDescription = description; } // end method setPartDescription
// get description public String getPartDescription() { return partDescription; } // end method getPartDescription
// set quantity public void setQuantity( int count ) { quantity = ( count < 0 ) ? 0 : count; // quantity cannot be negative } // end method setQuantity
// get quantity public int getQuantity() { return quantity; } // end method getQuantity
// set price per item public void setPricePerItem( double price ) { pricePerItem = ( price < 0.0 ) ? 0.0 : price; // validate price } // end method setPricePerItem
// get price per item public double getPricePerItem() { return pricePerItem; } // end method getPricePerItem
// return String representation of Invoice object public String toString() { return String.format( "%s: %s: %s (%s) %s: %d %s: $%,.2f", "invoice", "part number", getPartNumber(), getPartDescription(), "quantity", getQuantity(), "price per item", getPricePerItem() ); } // end method toString
// method required to carry out contract with interface Payable public double getPaymentAmount() { return getQuantity() * getPricePerItem(); // calculate total cost } // end method getPaymentAmount } // end class Invoice
___
// Problem 2: Payable.java // Payable interface declaration.
public interface Payable { double getPaymentAmount(); // calculate payment; no implementation } // end interface Payable
___
// Problem 2: PayableInterfaceTest.java // Tests interface Payable.
public class PayableInterfaceTest { public static void main( String args[] ) { // create six-element Payable array Payable payableObjects[] = new Payable[ 6 ]; // populate array with objects that implement Payable payableObjects[ 0 ] = new Invoice( "01234", "seat", 2, 375.00 ); payableObjects[ 1 ] = new Invoice( "56789", "tire", 4, 79.95 ); payableObjects[ 2 ] = new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 ); payableObjects[ 3 ] = /* create an HourlyEmployee object */ payableObjects[ 4 ] = /* create a CommissionEmployee object */ payableObjects[ 5 ] = /* create a BasePlusCommissionEmployee object */
System.out.println( "Invoices and Employees processed polymorphically: " );
// generically process each element in array payableObjects for ( Payable currentPayable : payableObjects ) { // output currentPayable and its appropriate payment amount System.out.printf( "%s ", currentPayable.toString() ); /* write code to determine whether currentPayable is a BasePlusCommissionEmployee object */ { /* write code to give a raise */ /* write code to ouput results of the raise */ } // end if
System.out.printf( "%s: $%,.2f ", "payment due", currentPayable.getPaymentAmount() ); } // end for } // end main } // end class PayableInterfaceTest
___
END OF QUESTION
Thank you
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started