2013-04-08 45 views
0

我正在用Java实现一个基本的工资计划。我有一个称为Employee的抽象超类,主要存储税号,名称等数据。然后,我有Employee的两个子类HourlySalaried,它们应该表示员工的类型。这两个类实现薪酬和税收的计算,并存储特定于其员工类型的数据。Java - 试图理解构图

麻烦的是,我与田堆最终成为新的领域需要实现存储计算的工资,税收等会我摆脱SalariedHourly并创建一个新的超级说不过去类,PayCalculation,然后有PayHourlyPaySalaried类推断这实现小时/薪水的特定领域和计算?如果是这样,在Employee(super class)和PayCalculation(子类)之间是否有构成关系是否合理?

我对构图没有很好的理解。如果有人能想出一个更好的方法来构建这个,我会非常感激它。

我不知道如何使用UML,但这里有一个我在涂料中做的非常低劣的图表来解释这一点。

enter image description here

+0

这个环节将是对您有用。 ** http://stackoverflow.com/q/2399544/1115584** – AmitG 2013-04-08 07:30:02

+0

谢谢。我觉得我在使用构图时感觉不合理(我不确定它是否有一种关系)。然而,我不知道如何以另一种方式构建它。我应该回到以前的结构吗? – 2013-04-08 07:35:39

回答

1

EmployeeSalaried(Employee)Hourly(Employee)非常适合用作类。

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

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

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

这是否有意义?真正深入地思考这些概念 - 试图掌握继承的概念,实际上是试图把握面向对象编程的概念。

请让我知道,如果我能以不同的方式解释任何事情 - 不久前我还在围绕着这些相同的概念。

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

这应该是这个问题的结论:你试图把握的是继承,而不是构图。

+0

谢谢,这是我以前的。我的Employee类中有10个字段最终会结束吗? – 2013-04-08 07:41:11

+0

不是。在。所有。有趣的是,我记得在我的第一个程序中有一个同样的担忧(实际上它与这个程序非常相似)。当我问我的教授这个同样的问题时,他告诉我,没有太多的领域普遍“太多”或“太少”。对于任何给定班级而言,适当的人数是需要的 - 不多也不少。 – drewmoore 2013-04-08 07:43:20

+0

好的,很酷!我猜如果我结束了bajillions(我不会),我可以将数据存储在某种数据结构中。 – 2013-04-08 07:44:24

2

是的,它做有意义有EmployeePayCalculation之间组成rel'ship。 以实用的方式思考此问题,因为 - Employee将具有payCalculations,workingHourCalculations等作为字段/组合,但不是其他方式。

Employee可以有抽象方法来计算工资,工作等需要员工的实例字段可以容纳的成员来计算工资,工作等

Public Employee { 
    private Map payCalMap; 
    ..... 
    public double calculatePay();  
} 
+0

这看起来也不错。我不确定我应该执行哪两个答案。 – 2013-04-08 07:43:16

+0

这只是一个例子。您可以使用任何适合该目的的数据结构类型。或甚至您自己的自定义数据结构实现。 – 2013-04-08 07:48:08

+0

薪酬计算等事情可以放在任何实用程序类中的单独帮助器方法中。这是因为计算是常见的,可以重复使用。 – 2013-04-08 07:50:30

2

员工班级将付款计算委托给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(); 
+0

谢谢,这看起来也是一个很好的方法。 – 2013-04-08 08:05:46