Logo
Section 1 / 11

子类型

让我们来学习一下子类型。

导入

子类型

让我们来学习一下子类型。

子类型(或子类)是自然语言、数学和信息科学中的一个基本概念。例如,在英语中,我们说“鸟”是一种“动物”,或者说所有鸟的集合是所有动物集合的一个子类。在语言学中,“鸟”这个名词是“动物”这个名词的下位词。

一种对象类型可以通过子类型进行细化,例如“鸟”可以被“鹦鹉”进一步细化;也可以通过超类型进行泛化,例如“鸟”和“哺乳动物”都可以被泛化为“动物”。细化和泛化是从不同角度看待这一概念的两种方式。

子类型会继承其超类型的所有特征。当子类型从超类型继承属性、关联和约束时,意味着这些特征在类图中无需重复绘制。对于图的阅读者来说,理解超类型的全部特征同样适用于其子类型非常重要。

当一个对象类型拥有多个直接超类型时,就出现了多重继承的情况。这在概念建模中很常见,但在许多面向对象编程语言(如 Java 和 C#)中是被禁止的。这些语言只允许每个对象类型具有唯一的直接超类型,即所谓的类层次结构。

通过细化引入子类型

每当一个新的对象类型代表另一个对象类型的特殊情况时,就可以通过细化引入该类型。一个典型的例子是将教科书和传记归类为书籍的不同类型。教科书和传记都具有 ISBN、标题和出版年份等共同特征,同时还具备更具体的特征:教科书有 subjectArea 属性,而传记有 about 属性。因此,在下图中,我们通过细化“书”这一对象类型,引入了 TextBook 和 Biography 两个子类型。结果,TextBook 和 Biography 都是 Book 的子类型。

...
对象类型 Book 有两个子类型:TextBook 和 Biography

当我们对一个对象类型进行细化时,会为其新增一些特征。在很多情况下,这些新增特征是更具体的信息。例如,当 TextBook 细化 Book 时,我们定义了额外的属性 subjectArea。在某些编程语言(如 Java)中,这种关系被称为子类型扩展了超类型。

此外,我们也可以在不添加新属性或操作的情况下对对象类型进行细化,方法是增加新的约束条件。

实现双向关联

超类型