Discussion
The safety is not always compatible with the notion of reusability.
- The conflict between inheritance and safety is a problem for OOPL too.
- Safety can not always be guaranteed.
Inheritance is a natural consequence of the IsA relationships.
However, inheritance sometimes renders inadequate modeling.
Consider two classes rectangle and square, with squares being specializations of rectangles:
rectangle: [
center: point,
sidelength: INTEGER,
secondsidelength: INTEGER ]
|
|
|
square: [
center: point,
sidelength: INTEGER ]
|
|
square: [ center: point, sidelength: INTEGER ]
rectangle IsA square: [ secondsidelength: INTEGER ]
|
Multiple inheritance can be simulated by single inheritance using
delegation, which can be useful in situations where the desired effect of reuse could not be achieved by inheritance in an intuitive way.
For example, extend the manager definition to include the shares of a manager:
manager IsA employee: [
staff: { employee } ]
|
|
⇒
|
manager IsA employee: [
asshareholder: shareholder,
staff: { employee },
myshares: INTEGER ]
PRIVATE: asshareholder
|
|
Whenever we create a
manager object, we now have to create a
shareholder object as well.
Any call to
myshares will delegate this call to the corresponding
asshareholder object by executing the path expression
asshareholder.shares, for example.