0

我正在用 Java 实现一个基本的工资单程序。我有一个名为的抽象超类Employee,主要存储税号、姓名等数据。然后我有 2 个Employee被调用的子类HourlySalaried它们应该代表员工的类型。这两个类实现了工资和税收的计算,并存储了特定于其员工类型的数据。

问题是,我最终得到了一堆字段,因为需要实施新字段来存储计算出的工资、税金等。我是否有理由摆脱SalariedHourly创建一个新的超类PayCalculation,然后拥有PayHourlyPaySalaried源于此的课程以实现每小时/带薪的特定领域和计算?Employee如果是这样,在(超类)和(子类)之间建立组合关系是否有意义PayCalculation

我对作曲没有很好的理解。如果有人能想到一种更好的方法来构建它,我将不胜感激。

我不知道如何使用 UML,但这是我在油漆中制作的一个非常劣质的图表来解释这一点。

在此处输入图像描述

4

3 回答 3

2

Employee是的,在和之间有组合关系是有意义的PayCalculation。以实际的方式考虑这个问题 -EmployeepayCalculationsworkingHourCalculations..作为字段/组合,而不是相反。

Employee可以有抽象方法来计算工资、工作等。Employee 的实例字段可以保存计算工资、工作等所需的成员。

Public Employee {
    private Map payCalMap;
    .....
    public double calculatePay();    
}
于 2013-04-08T07:35:32.070 回答
2

EmployeeSalaried(Employee)并且Hourly(Employee)非常适合作为类。

PayCalculation(), PayHourly(), 和PaySalaried()听起来更像是方法,对吧?

所以你可以做的是PayCalculation()在超类(Employee)中创建一个抽象方法(意味着你实际上并没有实现它)。然后你可以(并且确实必须)PayCalculation()在你的薪水和每小时课程中编写实现。

这意味着,当您在 Hourly 对象上调用 PayCalculation() 时,它将执行与在 Salried 对象上调用 PayCalculation() 时完全不同的事情。

这有意义吗?真正深入思考这些概念——试图掌握继承的概念实际上就是试图掌握一般的面向对象编程的概念。

如果我能以不同的方式解释,请告诉我——不久前,我还在思考这些相同的概念。

另外,您在上面的评论中是正确的。Employee 和 Hourly/Salied 之间没有“有”关系。它们之间存在的关系是一种“是”关系:一个小时工就是一个雇员。这意味着您需要考虑继承,而不是组合——这正是我们在这里讨论的内容。

这应该是这个问题的要点:您要掌握的是继承,而不是组合。

于 2013-04-08T07:36:12.610 回答
2

Employee 类将支付计算委托给 PayCalculation 接口方法calculate()

通过替换此接口的实现,您可以实现不同的行为。

class Employee {
  private PayCalculation payCalculation;
  public Employee(PayCalculation calculation){
    this.calculation = calculation;
  }

  public void calculatePayment(){
    payCalculation.calculate();
  }
}

public interface PayCalculation{
  public void calculate();
}

class PayHourly implements PayCalculation{
  public void calculation(){
    System.out.println("Hourly-paid");
  }
}

class PaySalaried implements PayCalculation{
  public void calculate(){
    System.out.println("Salary-paid");
  }
}

然后,您创建了 2 个具有不同支付系统的不同员工:

Employee salaryPaidEmployee = new Employee(new PaySalaried());
Employee hourlyPaidEmployee = new Employee(new PayHourly());

并根据支付系统计算支付:

 salaryPaidEmployee.calculatePayment();
 hourlyPaidEmployee.calculatePayment();
于 2013-04-08T07:52:15.227 回答