Discussion


The safety is not always compatible with the notion of reusability. 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.