This section details the semantics of multi-method lookup, beginning with a discussion of the motivations and assumptions that led to the semantics. All computation in Cecil is accomplished by sending messages to objects. The lion's share of the semantics of message passing specifies method lookup, and these method lookup rules typically reduce to defining a search of the inheritance graph. In single inheritance languages, method lookup is straightforward. Multiple dispatching introduces a similar potential ambiguity even in the absence of multiple inheritance, since two methods with differing argument specializers could both be applicable but neither be uniformly more specific than the other.
Some languages resolve all ambiguities automatically.
Again, this removes the possibility of run-time ambiguities, at the cost of automatically resolving ambiguities that may be the result of programming errors. The language should help identify these mistakes rather than mask or misinterpret them. Our experience with Self leads us to believe that programming errors that are hidden by such automatic language mechanisms are some of the most difficult and time-consuming to find. Our experience with Self also encourages us to strive for the simplest possible inheritance rules that are adequate. Accordingly, we have striven for a very simple system of multiple inheritance and multiple dispatching for Cecil.