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

Java,多重继承。我该怎么做?,java,design-patterns,inheritance,multiple-inheritance,Java,Design Patterns,Inheritance,Multiple Inheritance,我正在创建一个员工工资系统。我有一个抽象的Employee类员工和经理扩展员工。然后是程序员和销售人员extendWageEmployee 我的问题是我想创建一个SalesManager。salesmanager通过添加佣金和工资来计算他们的工资。所以他们有类型销售人员和经理 我应该制作什么界面,销售人员应该扩展什么 从manager扩展SalesManager,然后使SalesPerson成为一个界面是很自然的。但我不能,因为它继承自WageEmployee 我怎样才能让它工作呢。适当地 ab

我正在创建一个员工工资系统。我有一个抽象的
Employee
类<代码>员工和
经理
扩展
员工
。然后是程序员和销售人员extend
WageEmployee

我的问题是我想创建一个
SalesManager
salesmanager
通过添加佣金和工资来计算他们的工资。所以他们有类型
销售人员
经理

我应该制作什么界面,销售人员应该扩展什么

从manager扩展
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!"); }

}
员工
有方法
getFixedSalary()
getCommissionSalary()

您可以创建抽象子类
SalariedEmployee
GetCommissionSalary
始终返回0),并使
Programmer
SalesPerson
展开它<代码>销售经理直接执行
员工


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

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


看起来您有
Employee
s和
Manager
s,您必须决定从何处扩展功能。不看代码或对象模型,看起来每个人都是
员工
,其中一些人是
经理
。所以,看起来你需要决定一个经理要做什么才能使其与员工分离。然后一切都将扩展
Employee
,并扩展
Employee
的子类(
WageEmployee
salareyemployee
等),然后是管理者,他们实现了一个
Manager
接口。因此,您可以让一个
销售人员
扩展
员工
,然后让一个
销售经理
扩展
销售人员
,实现
经理

叫我疯了,但您可能不需要子类来处理不同的支付方法。取而代之的是,考虑用这个来计算工资/销售佣金。这样,您就有了一个类
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);
    }
}

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

是否有继承的功能,或者只是方法?我个人会从所有接口开始,这将为您提供最大的灵活性。然后,您需要从中找出哪些抽象实现将产生最少的重复工作。唯一的其他解决方案是使用代理样式的解决方案。就是,一个接口的功能实际上是由代理对象实现的,父对象维护对代理对象的引用并代表代理对象调用代理对象。在这种情况下,接口和对象组合是您的朋友。您可能应该开始研究另一种为员工建模的方法。也可以让PayStrategy.getPay进行模拟单个通用浮点值。然后SalesManager可以有一个这样的组合策略实现:public float getPay(float-ignored){return wageStrategy.getPay(getHoursWorked())+commissionStrategy.getPay(getsalesmaked());},其中SalesManager类有一个salesmake和一个hoursWorked字段。@AngerClown:True,但是参数的意义是什么呢?您不妨将
getHoursWorked()
GetSalesMaked()
(即使是抽象的)放在Employee上,在不重要的地方修复默认返回值(例如0),然后将
float ignored
一起删除。如果您故意调用参数
忽略
,则IMO有问题。