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

我的问题是我想创建一个SalesManagerSalesManger具有通过加佣金和薪金来计算的报酬。因此,它们的类型为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!"); }

}

最佳答案

叫我疯了,但是您可能不需要子类来处理这里的不同付款方式。相反,请考虑使用Strategy pattern来计算工资/销售佣金。这样,您就有了一个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);
    }
}

请注意,如何在不使用其他类别的情况下更改任何给定员工的薪酬策略,从而为该算法提供了更多的灵活性和封装性。

07-24 21:01