Pascal/Override, metodi virtuali e classi astratte

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Verranno ora introdotti alcuni concetti avanzati del paradigma OOP.

Override[modifica]

Nella programmazione orientata agli oggetti è possibile ridefinire un metodo che è stato ereditato dall'oggetto padre. Il metodo ovviamente dovrà avere lo stesso nome e lo stesso numero e tipo di parametri.

Facciamo subito un esempio:

TYPE TA = Object
            Procedure StampaMsg;
         End; 
     TB = Object (A)
         End;
Procedure A.StampaMsg;
BEGIN
   writeln("Messaggio del metodo originale.");  
END; 
Procedure B.StampaMsg;                {Override}
BEGIN
   writeln("Questo invece è il messaggio del metodo ridefinito."); 
END;
VAR A:TA;
    B:TB; 
BEGIN
   A.StampaMsg;  {metodo originale}
   B.StampaMsg;  {metodo ridefinito} 
   readln;
END.

Molte volte però si ha l'esigenza di creare un'estensione del metodo originale, in modo che possa fare altro e di più. Il Turbo Pascal ammette la parola riservata inherited per includere nel metodo la routine compresa nel metodo originale.


Riferendoci all'esempio di cui sopra, possiamo modificarlo per mostrare un possibile utilizzo della parola chiave inherited.

TYPE TA = Object
            Procedure StampaMsg;
         End; 
     TB = Object (A)
         End;
Procedure A.StampaMsg;
BEGIN
   writeln("Messaggio del metodo originale.");  
END; 
Procedure B.StampaMsg;                {Override}
BEGIN
   inherited StampaMsg;        {qui il compilatore include la routine del metodo dell'oggetto padre}
   writeln("Questo invece è il messaggio del metodo ridefinito."); 
END;
VAR A:TA;
    B:TB; 
BEGIN
   B.StampaMsg;  {metodo ridefinito} 
   readln;
END.

L'effetto del programma sopra sarà di stampare entrambi messaggi, ovvero quello della funzione originale e della funzione ridefinita, grazie all'istruzione

inherited StampaMsg

.

I metodi virtuali e le classi astratte[modifica]

Un metodo è chiamato virtuale quando non è definito nell'oggetto dove è stato dichiarato. Quindi la sua presenza sarà appunto virtuale.


Una classe che contiene metodi virtuali è chiamata classe astratta poiché, non avendo i metodi virtuali definiti, la stessa non può essere istanziata, cioè non possiamo creare un oggetto che contiene metodi astratti. Una classe astratta servirà come modello per altre classi che erediteranno da lei.