This question already has answers here:
Difference between Inheritance and Composition
                                
                                    (17个答案)
                                
                        
                7年前关闭。
            
        

我正在用Java实现基本的工资核算程序。我有一个称为Employee的抽象超类,该超类主要存储诸如税号,姓名等数据。然后,我有两个Employee的子类,分别称为HourlySalaried,它们应该表示雇员的类型。这两个类实现工资和税款的计算,并存储特定于其雇员类型的数据。

问题是,由于要实现新字段以存储计算出的薪水,税金等,我最终将获得大量字段。我是否有理由摆脱SalariedHourly并创建一个新的超级字段类,PayCalculation,然后具有PayHourlyPaySalaried类,以实现每小时/带薪的特定字段和计算?如果是这样,在Employee(超类)和PayCalculation(子类)之间具有组成关系是否有意义?

我对构图不太了解。如果有人能想到一种更好的结构方式,我将不胜感激。

我不知道如何使用UML,但这是我用油漆绘制的一个伪劣图表来解释这一点。

最佳答案

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

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

因此,您可以做的是在超类(Employee)中创建一个抽象方法(实际上并没有实现)PayCalculation()。然后,您可以(并且实际上将不得不)在Salaried和Hourly类中编写PayCalculation()的实现。

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

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

请让我知道,如果我能以不同的方式解释任何事情-不久之前,我就围绕着这些相同的概念进行了研究。

另外,您在上面的评论中是正确的。员工与小时/薪水之间不存在“具有”关系。它们之间存在的关系是“是”关系:每小时雇员是雇员。这意味着您需要考虑继承,而不是组合-这正是我们在这里一直在谈论的内容。

这应该是解决这个问题的方法:您要掌握的是继承,而不是组成。

10-01 01:57