Class linearization
Factor handbook » The language » Objects » Classes

Prev:Class operations

Classes have an intrinsic partial order; given two classes A and B, we either have that A is a subset of B, B is a subset of A, A and B are equal as sets, or they are incomparable. The last two situations present difficulties for method dispatch:
If a generic word defines a method on a mixin class A and another on class B, and B is the only instance of A, there is an ambiguity because A and B are equal as sets; any object that is an instance of one is an instance of both.
If a generic word defines methods on two union classes which are incomparable but not disjoint, for example sequence and number, there is an ambiguity because the generic word may be called on an object that is an instance of both unions.

The first ambiguity is resolved with a tie-breaker that compares metaclasses. The intrinsic meta-class order, from most-specific to least-specific:
Built-in classes and tuple classes
Predicate classes
Union classes
Mixin classes

This means that in the above example, the generic word with methods on a mixin and its sole instance will always call the method for the sole instance, since it is more specific than a mixin class.

The second problem is resolved with another tie-breaker. When performing the topological sort of classes, if there are multiple candidates at any given step of the sort, lexicographical order on the class name is used.

class< ( first second -- ? )

sort-classes ( seq -- newseq )

smallest-class ( classes -- class/f )

Metaclass order:
rank-class ( class -- n )