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