我正在创建员工工资系统。我有一个抽象的Employee
类。 WageEmployee
和Manager
扩展了Employee
。然后Programmer和SalesPerson
扩展WageEmployee
。
我的问题是我想创建一个SalesManager
。 SalesManger
具有通过加佣金和薪金来计算的报酬。因此,它们的类型为SalesPerson
和Manager
。
我应该建立一个接口,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
对象作为属性,该对象可以具有具体的子类WagePayStrategy
和CommissionPayStrategy
。如果您在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);
}
}
请注意,如何在不使用其他类别的情况下更改任何给定员工的薪酬策略,从而为该算法提供了更多的灵活性和封装性。