This question already has answers here:
Difference between Inheritance and Composition
(17个答案)
7年前关闭。
我正在用Java实现基本的工资核算程序。我有一个称为
问题是,由于要实现新字段以存储计算出的薪水,税金等,我最终将获得大量字段。我是否有理由摆脱
我对构图不太了解。如果有人能想到一种更好的结构方式,我将不胜感激。
我不知道如何使用UML,但这是我用油漆绘制的一个伪劣图表来解释这一点。
(17个答案)
7年前关闭。
我正在用Java实现基本的工资核算程序。我有一个称为
Employee
的抽象超类,该超类主要存储诸如税号,姓名等数据。然后,我有两个Employee
的子类,分别称为Hourly
和Salaried
,它们应该表示雇员的类型。这两个类实现工资和税款的计算,并存储特定于其雇员类型的数据。问题是,由于要实现新字段以存储计算出的薪水,税金等,我最终将获得大量字段。我是否有理由摆脱
Salaried
和Hourly
并创建一个新的超级字段类,PayCalculation
,然后具有PayHourly
和PaySalaried
类,以实现每小时/带薪的特定字段和计算?如果是这样,在Employee
(超类)和PayCalculation
(子类)之间具有组成关系是否有意义?我对构图不太了解。如果有人能想到一种更好的结构方式,我将不胜感激。
我不知道如何使用UML,但这是我用油漆绘制的一个伪劣图表来解释这一点。
最佳答案
Employee
,Salaried(Employee)
和Hourly(Employee)
非常适合作为类。PayCalculation()
,PayHourly()
和PaySalaried()
听起来更像是方法,对吗?
因此,您可以做的是在超类(Employee)中创建一个抽象方法(实际上并没有实现)PayCalculation()
。然后,您可以(并且实际上将不得不)在Salaried和Hourly类中编写PayCalculation()
的实现。
这意味着,当您在Hourly对象上调用PayCalculation()时,它将做的事情与您在Salaried对象上调用PayCalculation()时的事情完全不同。
这有意义吗?真正地深入思考这些概念-试图掌握继承的概念实际上就是试图掌握面向对象编程的概念。
请让我知道,如果我能以不同的方式解释任何事情-不久之前,我就围绕着这些相同的概念进行了研究。
另外,您在上面的评论中是正确的。员工与小时/薪水之间不存在“具有”关系。它们之间存在的关系是“是”关系:每小时雇员是雇员。这意味着您需要考虑继承,而不是组合-这正是我们在这里一直在谈论的内容。
这应该是解决这个问题的方法:您要掌握的是继承,而不是组成。
10-01 01:57