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 16.5 below,
the class Vehicle
is the root of a single-inheritance
hierarchy, while Figure 16.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 16.6 above, it
is {incomplete, overlapping}.
An information model may contain any number of class hierarchies.