维恩图中的类表示

Yak*_*kan 2 c++ class venn-diagram

在我们的课程中,我们的老师用 UML 和维恩图绘制了类关系图。

受薪雇员继承雇员类

Hourly Employee 继承 Employee 类

(我真的不记得课程的背景了)

他画的维恩图是这样的:

班级维恩图作为教师

但是,我真的不相信它应该是这样的。在我看来,它是这样的:

我心目中的班级维恩图

顺便说一下,为了简化图,我们都假设类私有部分不包含在图表表示中,或者像 3 个带有交集的集合。

所以我的问题很简单,哪一个是正确的/最接近正确的表示。

Jas*_*ker 5

从某种意义上说,他们都是。

第一张图准确地描述了类之间的继承关系。那个图是说“在所有员工的集合中,有些员工是小时工,有些是领薪水。他们之间没有重叠。” Employee是更一般的集合,所以它包含两个更具体的集合。

第二张图是说“有些员工既是小时工又是受薪员工。其中一些是员工。” 这在继承的上下文中显然没有多大意义。

但是,第二张图或多或少准确地表示了这些类之间共享的数据。成员Hourly EmployeeSalaried Employee物体都会有一些重叠,而且重叠中包含什么Employee对象。例如,您可能有一些这样的类定义:

class Employee {
    int employee_id;
}

class SalariedEmployee extends Employee {
    int salary;
}

class HourlyEmployee extends Employee {
    int wage;
}
Run Code Online (Sandbox Code Playgroud)

SalariedEmployee并且HourlyEmployeeemployee_id从他们的超类继承成员。如果您将类定义绘制为维恩图,您绘制的第二个图大致就是您想出的,但在适当的设计中,Employee类将是整个交集。

您可能会发现以这种方式考虑继承关系很有用,尤其是在您学习 OO 时,但在大多数情况下,您会发现第二个图通常是隐含的,而不是陈述的。