Magagne e ottimizzazione (piu` che altro del codice prodotto, anche se qualcosa lo fa gia`) a parte, il compilatore dovrebbe essere essenzialmente finito. Ha ereditarieta`, polimorfismo, e ora anche interfacce e metodi virtuali. A me non sembrano neanche tanto illeggibili nell'uso pratico:


E` un programmino di prova fatto per poi seguire lo sviluppo di una librerietta (dal nome nostalgico di "character generator") che scriva qualcosa con un font bitmapped. Il succo della questione dell'interfaccia e` questo qui:
p as bitmap <- Create m By n Pixels
q as characterGenerator <- Bind To bitmap Using Raster p
Fa il typecasting sul registro p, cioe` di che il registro p e` di tipo... bitmap, creandone un'istanza e dimensionandola a m x n pixels. E fin qui s'era gia` visto. La seconda riga crea invece l'interfaccia (la novita`). Casta q a characterGenerator, e poi lo "binda" (blinda la supercazzola prematurata eccetera eccetera), cioe` lo lega alla sua implementazione per bitmaps. Dice "Using Raster" perche` la classe astratta da cui discendono bitmap e canvas, i due tipi concreti di raster, e` appunto raster. Seguendo la prima riga del listato si arriva al file che definisce l'implementazione:


che a sua volta include il file che definisce l'interfaccia e qualcosa per fare un puntino sullo schermo per confermare che il metodo "Say" e` stato eseguito. La vera implementazione va al posto di quel puntino, ma devo ancora scriverla. Al di la` di quello, le parole chiave li` sono "implements" nella dichiarazione del nameset, e l'esportazione della tabella dei metodi virtuali, che lega la entry pSay della tabella dell'interfaccia all'indirizzo del metodo Say implementato sopra. Nel file dell'interfaccia:


che e` scarno e abbozzato (ha solo il metodo Say e nessuna informazione di stato) si vede la inlet "Bind To p" che alloca l'istanza dell'interfaccia, e poi la passa a un'utilita` che smista gli indirizzi dei metodi alle entries della tabella (la tabella e` composta solo da "count pSay"). In fondo, dopo un costruttore alternativo e un mutator tanto per dire, quello che conta e` il metodo virtuale Say, che infatti non e` implementato li` ma esegue un salto per puntatore a r.pSay.
Facile, no?