To improve flexibility in leveraging types, a type may establish these kinds of relationships with other types:

We have already seen composition at play in the typed fields of a struct, the elements of an array, and the value type pointed at by some reference type. It is now time to explore how one might define and exploit inheritance and subtyping to improve code versatility and reuse.