Quali istruzioni per il preprocessing dovrebbe fornire ooc? Osservando quanto indicato nella sezione 7.1 ci sono tre aspetti in cui ooc potrebbe aiutare: dato un nome di un metodo, conoscere l'header del metodo; dato un metodo, controllare e importare i parametri oggetto; produrre da qualche parte selettori, il costruttore della metaclasse e la funzione di inizializzaione come richiesto.
Utilizzando ancora la classe Point come esempio, la seguente implementazione di Point.dc sembra essere valida:
% move { %casts self —> x += dx, self —> y += dy; } % Point ctor { struct Point * self = super_ctor(Point, _self, app); self —> x = va_arg(* app, int); self —> y = va_arg(* app, int); return self; } % Point draw { %casts printf("\".\" at %d,%d\n", x(self), y(self)); } %init
Il grassetto indica ciò che ooc trova interessante:
% method { header for statically linked method % class method { header to overwrite dynamically linked method %casts import object parameters %init create selectors and initialization code
Per un metodo con linking statico, conosciamo già la classe per la quale è stato dichiarato. Ad ogni modo, la classe potrebbe essere specificata comunque, e se dovremo decidere di cambiare il linkage del metodo in seguito, non avremo la necessità di rieditare il codice sorgente.
C'è una domanda che dovremmo comunque porci: dobbiamo o non dobbiamo richiedere che il programmatore specifichi a mano l'header del metodo, la lista dei parametri e così via? Mentre questa soluzione rende semplice da leggere il file implementazione, è più complesso mantenere la coerenza se la definizione di un metodo cambia.