ansi-c:
Le moderne workstation hanno parecchia memoria. Se un programma perde le tracce di un byte qua e là non fa di solito una gran differenza. Tuttavia, questi memory leaks sono di solito sintomo di errori negli algoritmi.
respondsTo() deve cercare la descrizione di classe per un tag e restituire il corrispondente selettore.
Quando diamo un'occhiata ai metodi linkati dinamicamente, accordandoci su una nomenclatura per realizzare il callback, non sembra porre particolari limiti. Un metodo viene chiamato da un particolare oggetto, ossia quale codice viene eseguito per un callback dipende dall'oggetto in relazione …
Come fa un oggetto a raggiungere il suo delegato? Quando un oggetto Filter viene costruito riceve il delegato come un argomento. La descrizione di classe Filter.d definisce i tipi di funzioni per le possibili funzioni di callback e i componenti …
Analizzare una linea di comando è un problema generale comune a tutti i programmi filtro. Dobbiamo riconoscere due segni meno – ossia la fine della lista delle opzioni – oppure un singolo segno meno, dobbiamo riconoscere i valori delle opzioni, …
Avendo trovato parecchi difetti all'idea delle classi di base astratte, abbiamo bisogno di cercare una idea migliore per le funzioni di callback.
Un oggetto punta alla sua descrizione di classe. La descrizione di classe punta a tutti i metodi dinamicamente linkati applicabili all'oggetto.
Se scegliamo di sostituire il nome di una descrizione di classe come ad esempio Point da una chiamata alla funzione inizializzazione Point() per generare le descrizioni di classe in via automatica, dobbiamo modificare ogni utilizzo di una descrizione di classe …
munch è una soluzione portabile anche se inefficiente per tutto quello che può riguardare i problemi di inizializzazione statica.
Come eccezione, _Object deve essere il nome di una struttura e non un puntatore alla struttura, tanto che &_Object può essere utilizzato per inizializzare la struttura.
void * è un tipo molto lasco che abbiamo sfruttato per costruire i metodi polimorfici e, in particolare, il nostro meccanismo per la selezione dei metodi linkati dinamicamente
Ipotizziamo che libooc.a è una libreria con un modulo initializers.o che definisce l'array initializers[] come mostrato sopra contenente solo il puntatore null.
Le descrizioni di classe sono essenzialmente oggetti statici. Dovrebbero esistere finchè il programma principale è in esecuzione. Tale fine viene realizzando creando oggetti quali variabili globali o statiche e inizializzandole a tempo di compilazione.
Le descrizioni di classe sono oggetti la cui vita può durare a lungo. Sono costanti ed esistono praticamente tanto quanto dura l'esecuzione dell'applicazione. Se possibile, tali oggetti sono inizializzati al tempo di compilazione.
Tecnicamente, i selettori delle superclassi possono essere usati solamente da metodi interni. Decidiamo di non controllare i parametri dei selettori della superclasse. E' davvero una saggia decisione.
cast() è basata su isOf() che chiama classOf e possibilmente super(). Entrambi i metodi seguono la nostra codifica standard e importano i loro parametri con %casts, che a turno chiama cast() per verificare se gli argomenti siano Oggetto o Classi …
Quindi, lasciamo che sia il selettore a controllare gli oggetti che non si trovano nella classe corrente e lasciamo che i metodi linkati dinamicamente controllino a loro volta gli oggetti nella loro propria classe.
L'idea base è chiamare cast() tutte le volte che è necessario. Quando un metodo staticamente linkato dereferenzia gli oggetti nella sua stessa classe, dovrebbe fare proprio questo;
Con gli assiomi di cui sopra, i metodi isA() e isOf() sono abbastanza semplici da implementare:
Come esempio di quanto possiamo fare con isOf() e come cast() può rendere più sicuro il codice, consideriamo le modifiche seguenti in relazione al programma di test.