- Every use of inheritance should belong to one of the accepted categories.
- Every use of inheritance should preferably belong to just one of the accepted categories.
If B is a subset of A and any other subset of A is disjoint from B ( A ∩ B = ⦳ ) then A must be defered.
If B is a subset of A and instances of B are thoes that satisfy a certain constraint. The constraint should be expressed as part of the invariant of B and not A. Any feature added to B should be a logical consequence of the added constraint. Both A and B should be either deferred or effective.
If B is a subset of A and B introduces features not present in A and not applicable to direct instances of A. A must be effective.
If B is a subset of A and B redefines some features of A, B must not introduce any features that are not direct needs of the redefined feature. There are two types:
- Function where the redefinition affects feature body rather than just their signature.
- Type where all redefinitions are signature redefinitions.
Both A and B should be either deffered or effective.
If B is a subset of A and B redefines some of the effective features of A into deffered features. A will normally be effective and B will be deffered.
If B is a subset of A where A represents some kind of data structure and B represents a partial or complete choice of implementation of A. A will be deffered and B may be deffered or effective.
If A represents a general structural property such as being comparable and B represents a certain type of object the posses that property. A will be deffered and B may be deffered or effective.
If B obtains from A a set of features necessary to the implementation of the abstraction associated with B. Both A and B must be effective.
Applies if A exists solely for the purpose of providing a set of logically related features for the benefit of it heirs. Two variants are:
- Constant where all features of A are constants.
- Machine where the features of A are routines which may be viewed as operations on an abstract machine.