在我们的课程中,我们的老师用 UML 和维恩图绘制了类关系图。
受薪雇员继承雇员类
Hourly Employee 继承 Employee 类
(我真的不记得类的上下文)
他画出这样的维恩图:
但是,我真的不相信它应该是这样的。在我看来,它是这样的:
顺便说一句,我们都假设类私有部分不包含在图表表示中,或者为了简化图表,它就像 3 个带有交叉点的集合。
所以我的问题很简单,哪一个是正确的/最接近正确的表示。
在我们的课程中,我们的老师用 UML 和维恩图绘制了类关系图。
受薪雇员继承雇员类
Hourly Employee 继承 Employee 类
(我真的不记得类的上下文)
他画出这样的维恩图:
但是,我真的不相信它应该是这样的。在我看来,它是这样的:
顺便说一句,我们都假设类私有部分不包含在图表表示中,或者为了简化图表,它就像 3 个带有交叉点的集合。
所以我的问题很简单,哪一个是正确的/最接近正确的表示。
从某种意义上说,他们都是。
第一张图准确地描述了类之间的继承关系。该图表示“在所有员工的集合中,一些员工是小时工,一些是受薪员工。他们之间没有重叠。” Employee
是更一般的集合,因此它包含两个更具体的集合。
第二个图是说“有些员工是按小时计薪的。其中一些是员工。” 这在继承的上下文中显然没有多大意义。
但是,第二张图或多或少准确地表示了这些类之间共享的数据。Hourly Employee
和Salaried Employee
对象的成员会有一些重叠,而重叠就是Employee
对象中包含的内容。例如,您可能有一些这样的类定义:
class Employee {
int employee_id;
}
class SalariedEmployee extends Employee {
int salary;
}
class HourlyEmployee extends Employee {
int wage;
}
SalariedEmployee
并且HourlyEmployee
都从其超类继承该employee_id
成员。如果您要将类定义绘制为维恩图,那么您绘制的第二个图大致就是您想出的,但在适当的设计中,Employee
类将是整个交集。
您可能会发现以这种方式考虑继承关系很有用,尤其是在您学习 OO 时,但在大多数情况下,您会发现第二个图通常是隐含的,而不是陈述的。
维恩图在集合的元素周围放置圆圈。这里每个元素都是一个员工。想象一下散布在页面上的点,它们被或不被圆圈包围。每个点都是一个员工。所有的点都将落在员工圈内。你的老师的图表说,小时工和受薪员工是雇员,没有员工是按小时和工资支付的。
也可以使用相同的设置来组织代表/对应于员工的抽象 C++ 值。
您必须先同意这些术语/圆圈的定义,然后才能绘制它们。例如,在某些业务中,可能有些员工是双向支付的;然后小圆圈重叠。也许小圈子外没有员工;也许有。
除非您解释点何时应该落在圆圈中,否则很难知道您要对员工说什么或您认为老师要说什么。
(您可能会将圆的元素视为结构值,其中圆包括具有一定数量的公共成员和/或字段或更少的那些。或者圆元素是公共结构成员和/或对应于各种类型的类的字段的员工。
但是你的员工圈应该与两种员工圈重叠。)
第一张图是对的。受薪和小时工都从 Employee 继承。它们都满足“is-a”员工关系。
根据声明,您提到您的案例中的假设如下:受薪员工 -- 继承---> 小时工 -- 继承 ---> 员工
如果是这种情况,那么我认为这两个图表都不正确。
它应该如下: -
最大的圈子:员工;其中:每小时;其中(最小):员工