Programmazione orientata agli oggetti in ANSI-C. Linkage ed ereditarietà

move() non è linkata dinamicamente e non usa un metodo linkato dinamicamente per compiere il suo lavoro. Mentre possiamo passare punti e cerchi indifferentemente a move(), non siamo di fronte ad una vera e propria funzione polimorfica. Move() non si comporta in maniera diversa a seconda di oggetti diversi sui quali agisce.

La situazione è differente per un metodo linkato dinamicamente come draw(). Osserviamo ancora la figura precedente, questa volta con la descrizione di tipo illustrata esplicitamente.

Quando effettuiamo l'up-cast di un cerchio a un punto non cambiamo lo stato del cerchio, cioè anche se consideriamo la rappresentazione di un cerchio come se fosse quella di un punto, non andiamo a cambiare il suo contenuto. Di conseguenza, il cerchio visto come un punto ha ancora una descrizione di tipo relativa a Circle perchè il puntatore nella sua componente .class non è cambiato.

Draw() è la funzione selettore, cioè prende qualsiasi argomento che viene passato come self, procede alla descrizione di tipo indicata da .class e chiama il metodo ivi memorizzato.

Una sottoclasse eredita i metodi linkati statisticamente dalla sua superclasse – quei metodi operano sulla parte della sottoclasse che è già presenta nell'oggetto superclass. Una sottoclasse può scegliere di fornire i suoi propri metodi al posto dei metodi dinamicamente linkati dalla superclasse. Se ereditati, ossia se non sovrascritti, i metodi linkati dinamicamente dalla superclasse funzioneranno proprio come i metodi staticamente linkati e andranno a modificare la parte della superclasse di un oggetto della sottoclasse. Se sovrascritto, la versione della sottoclasse di un metodo dinamicamente linkato avrà accesso all'intera rappresentazione dell'oggetto della sottoclasse, ossia per un cerchio draw() invocherà Circle_draw() che considera il raggio quando si disegna un cerchio.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend