Java,多重继承。我该怎么做?

时间:2012-07-12 23:32:59

标签: java design-patterns inheritance multiple-inheritance

我正在建立员工工资制度。我有一个抽象的Employee类。 WageEmployeeManager延长Employee。然后程序员和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!"); }

}

3 个答案:

答案 0 :(得分:10)

叫我疯了,但你可能不需要子类来处理这里的不同付费方式。相反,请考虑使用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);
    }
}

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

答案 1 :(得分:1)

Employee包含方法getFixedSalary()getComissionSalary()

您可以创建抽象子类SalariedEmployeegetComissionSalary始终返回0)并使ProgrammerSalesPerson展开它。 SalesManager直接实施Employee

或者所有课程都直接从Employee继承,以便在薪资水平有一天发生变化时给予最大的灵活性(我会这样做)。编写辅助方法以避免重复代码,但如果以后需要,仍然可以选择更改操作方法。

答案 2 :(得分:1)

扩展类时,通常需要保留某种功能,然后通过扩展它来添加它。通过Interface,它可以为您提供对象所具有的方法列表。

看起来你有EmployeeManager s,你必须决定功能的扩展位置。在不查看代码或对象模型的情况下,看起来每个人都是Employee,其中一些是Manager。所以看起来你需要决定管理员做什么,使其与员工分开。然后一切都将扩展Employee,并扩展EmployeeWageEmployeeSalaryEmployee等的子类,然后是管理者的子类,它们实现Manager接口。因此,您可以SalesPerson扩展WageEmployee,然后SalesManager扩展SalesPerson,以实现Manager