6

我正在创建一个员工工资系统。我有一个抽象Employee类。WageEmployeeManager扩展Employee。然后程序员和SalesPerson扩展WageEmployee

我的问题是我想创建一个SalesManager. 他们的SalesManger工资是通过增加佣金和工资来计算的。所以他们有类型SalesPersonManager

我应该做什么接口,应该SalesPerson扩展什么?

从管理器扩展SalesManager,然后做SalesPerson一个接口是很自然的。但我不能,因为它继承自WageEmployee...

我怎样才能让它工作。适当地?

abstract class Employee 
{
  String name;

  Employee() {}
  Employee (String nm) { name = nm; }
  abstract double computePay();
  void display () {}
  void setHours(double hrs) {}
  void setSales(double sales) {}
  void setSalary(double salary) { System.out.println("NO!"); }

}

4

3 回答 3

10

说我疯了,但你可能不需要子类来处理这里不同的支付方式。相反,考虑使用策略模式来计算工资/销售佣金。这样,您就有了一个类Employee及其子类SalesEmployee;这些中的每一个都将具有一个对象作为属性PayStrategy,该对象可以具有具体的子类WagePayStrategyCommissionPayStrategy. 如果您在PayStrategy(可能是接口或抽象类)上定义了正确的方法,您可以让您的Employee实例询问策略对象员工因某些输入(工作时间、销售额等)而获得的报酬。

考虑以下简单的示例:

interface PayStrategy {
    public float getPay(float hoursWorked, float salesMade);
}

class WageStrategy implements PayStrategy {
    public float getPay(float hoursWorked, float salesMade) {
        return hoursWorked * 8.5;
    }
}

class CommissionStrategy implements PayStrategy {
    public float getPay(float hoursWorked, float salesMade) {
        return salesMade * 0.5 + hoursWorked * 5.0;
    }
}

abstract class Employee {
    public PayStrategy payStrategy; // assign as needed

    public float getPay(float hoursWorked, float salesMade) {
        return this.payStrategy.getPay(hoursWorked, salesMade);
    }
}

请注意如何在不需要不同类别的情况下更改任何给定员工的薪酬策略,从而为您提供更多的灵活性和围绕该算法的封装。

于 2012-07-12T23:44:32.293 回答
1

Employee有方法getFixedSalary()getComissionSalary().

您可以创建抽象子类SalariedEmployeegetComissionSalary始终返回 0)并制作ProgrammerSalesPerson扩展它。SalesManager直接实现Employee

或者所有的类都直接继承自Employee,以在薪水等级发生变化时提供最大的灵活性(我会这样做)。编写辅助方法以避免重复代码,但如果以后需要,您仍然可以选择更改操作方式。

于 2012-07-12T23:41:57.910 回答
1

当您扩展类时,您通常希望保留某种功能并通过扩展来添加它。使用接口,它为您提供对象将具有的方法列表。

看起来你有Employees 和Managers,你必须决定从哪里扩展功能。不查看您的代码或对象模型,看起来每个人都是 anEmployee并且其中一些是Manager. 所以看起来你需要决定一个经理做什么额外的事情,使它与一个员工分开。然后一切都将扩展Employee,并扩展EmployeeWageEmployee,,SalaryEmployee等)的子类,然后是管理器,它们实现一个Manager接口。所以你可以有一个SalesPerson扩展 aWageEmployee然后一个SalesManager扩展SalesPerson来实现Manager.

于 2012-07-12T23:44:23.833 回答