Con gli assiomi di cui sopra, i metodi isA() e isOf() sono abbastanza semplici da implementare:
% isA { return _self && classOf(_self) == class; } % isOf { if (_self) { const struct Class * myClass = classOf(_self); if (class != Object) while (myClass != class) if (myClass != Object) myClass = super(myClass); else return 0; return 1; } return 0; }
Una prima, molto semplice implementazione di cast() si può basare su isOf():
% cast { assert(isOf(_self, class)); return (void *) _self; }
isOf(), e di conseguenza cast(), determinano errori se i puntatori sono null. IsOf() si basa senza ulteriori verifiche che un qualsiasi puntatore punti ad almeno un'istanza di Object: di conseguenza possiamo essere sicuri che cast(Object,x) restituirà errori solamente di fronte a puntatori nulli. Tuttavia, come vedremo nella sezione 8.5, questa soluzione è ampiamente perfettibile.
Il tuo commento, proprio su un tutorial di programmazione C (orientata agli oggetti) mi fa molto piacere. Grazie!