A type hierarchy (or class
hierarchy) consists of two or more types, one of them being the root (or
top-level) type, and all others having at least one direct supertype. When all non-root types
have a unique direct supertype, the type hierarchy is a single-inheritance hierarchy, otherwise it's a
multiple-inheritance
hierarchy. For instance, in Figure 17.5 below, the class
Vehicle
is the root of a single-inheritance hierarchy, while Figure 17.6 shows an example of a
multiple-inheritance hierarchy, due to the fact that AmphibianVehicle
has two
direct superclasses: LandVehicle
and WaterVehicle
.
The simplest case of a class hierarchy, which has only one level of subtyping, is called a generalization set in UML, but may be more naturally called segmentation. A segmentation is complete, if the union of all subclass extensions is equal to the extension of the superclass (or, in other words, if all instances of the superclass instantiate some subclass). A segmentation is disjoint, if all subclasses are pairwise disjoint (or, in other words, if no instance of the superclass instantiates more than one subclass). Otherwise, it is called overlapping. A complete and disjoint segmentation is a partition.
In a class diagram, we can express these constraints by annotating the shared generalization
arrow with the keywords complete and disjoint enclosed in braces. For instance, the annotation of a
segmentation with {complete, disjoint} indicates that it is a partition. By default, whenever
a segmentation does not have any annotation, like the segmentation of Vehicle
into LandVehicle
and WaterVehicle
in Figure 17.6 above, it is
{incomplete, overlapping}.
An information model may contain any number of class hierarchies.