为什么我的Polymorphic Parent类从内部调用Subclass方法?

时间:2009-10-14 16:29:58

标签: java algorithm inheritance polymorphism abstract-class

这是迄今为止我编写的代码。它的全部功能和唯一的抱怨是我的每周和年薪的输出总是每周......我不知道如何从toString方法中得到它。

public class PolyEmployees {
    public static void main(String[] args) {

        Employee [] myEmployees = {
            new Hourly("Joan Rivers", "Human Resources", 12.45, 34.3),
            new Hourly("Jason Nezbit", "Accounting", 15.25, 46.0),
            new Hourly("Ingrid Homes", "Secretary", 10.11, 38.7),
            new Salaried("Amy Liberman", "Human Resources Executive", 32.50),
            new Salaried("Xander Xavar", "Resource Processing", 29.20),
            new Salaried("Milly Rockhome", "PR Executive", 65.28)
        };

        // Output all employee types
        for (int i = 0; i < myEmployees.length; i++)    {
            System.out.println("\n" + myEmployees[i].toString());
        }                 
    }

}

/*
 * Employee abstract class
 */

abstract public class Employee {
    private String mName;
    private String mDepartment;
    protected Double mRate;

    // Constructor
    public Employee(String mName, String mDepartment, Double mRate) {
        this.mName = mName;
        this.mDepartment = mDepartment;
        this.mRate = mRate;
    }

    // Annual Pay
    public Double pay() {   // 40 Hours a Week, 52 weeks in a year
        return ((this.mRate * 40) * 52);
    }

    @Override
    public String toString() {
        return "Employee: " + this.mName + "\nDepartment: " + this.mDepartment + "\nAnnual Pay: " + this.pay();
    }
}

/*
 * Hourly employee class
 */

public class Hourly extends Employee {
    private Double mHours;

    public Hourly(String mName, String mDepartment, Double mRate, Double mHours) {
        super(mName, mDepartment, mRate);
        this.mHours = mHours;
    }

    @Override
    public Double pay() {   // Weekly Pay, deals with overtime for hourly employee

        if (this.mHours > 40.0) {
            return ((40 * this.mRate) + ((this.mHours-40) * (this.mRate * 1.5)));
        }
        else    {
            return (this.mHours * this.mRate);
        }       
    }

    public String toString() {
        return super.toString() + "\tWeekly Pay: " + pay();
    }

}

/*
 * Salaried Employee Class
 */

public class Salaried extends Employee{

    public Salaried(String mName, String mDepartment, Double mRate) {
        super(mName, mDepartment, mRate);
    }

    @Override
    public Double pay() {   // Weekly Pay
        return (this.mRate * 40);
    }

    @Override
    public String toString() {
        return super.toString() + "\tWeekly Pay: " + this.pay();
    }
}

除了年薪外,我得到了我想要的所有输出。单步执行调试器,即使从父进程内调用,它也会返回到childs pay方法。由于它已被覆盖,我对此并不感到惊讶,但我的可交付成果的一部分是每周从子类中获取,每年从超级中获取。

所以这引出了我的问题,如何从父母那里获得年薪?我别无选择,只能将其作为员工投射,作为我系统输出的一部分,还是我缺少一些东西?

另一方面,我喜欢这个网站的流畅程度。当你输入它时,我去过的地方并不多。

评论说明:根据我的可交付成果,薪水和小时工人toString必须每周返还工资。员工抽象类本身包含返回年薪的方法。

3 个答案:

答案 0 :(得分:1)

您可以选择从子类调用super。例如,toString中的Salaried可能如下所示:

return super.toString() + "\tWeekly Pay: " + this.pay()+ "\tAnnual Pay: " + super.pay());

答案 1 :(得分:1)

是的,在pay()中调用Employee确实会在Salaried.pay()对象的上下文中调用Salaried。这就是多态的关键 - 派生类可以覆盖行为。

现在让我感到震惊的是,如果你有getAnnualPay()getWeeklyPay()的单独方法 - 可能只在基类中有getAnnualPay(),并且引入{{ 1}} getWeeklyPay()

答案 2 :(得分:0)

在您的子类中,您将覆盖pay()方法。如果您希望员工同时拥有年薪和定期薪酬,您应该为子类添加抽象方法periodicPay()以覆盖并将pay()保留为最终。