Managing static structures involves layers of abstraction and of refinement showing visibility and encapsulation, respectively. These two notions define different kinds of hierarchical relations as described in the following:
A linear client-server relation is formed when a component provides primitive abstractions to another component. In this sense components may refer to abstractions that, once defined, may be used throughout the entire design (at all levels). Layers of abstractions are connected when a module, the client, explicitly requests to use the facilities or abstractions provided by another module, the server. This relationship forms a linear hierarchy, whereby visibility is not transitive. Note that in support for reusability, server units must not know the identity of the client modules.
A tree-like hierarchy of refinement relations is formed when an abstraction (i.e., a component) is implemented, and recursively divides into subcomponents. A refinement relation specifies how a module (parent) is decomposed into a refinement module (child). This relationship always defines a tree-like hierarchy. Inheritance is a special case of refinement relations.