Classi astratte
Il meccanismo dell'ereditarieta` e quello del polimorfismo possono essere combinati
per realizzare delle classi il cui unico scopo e` quello di stabilire una interfaccia
comune a tutta una gerarchia di classi:
class TShape {
public:
virtual void Paint() = 0;
virtual void Erase() = 0;
/* ... */
};
Notate l'assegnamento effettuato alle funzioni virtuali, funzioni di questo
tipo vengono dette funzioni virtuali pure e l'assegnamento ha
il compito di informare il compilatore che non intendiamo definire i metodi
virtuali. Una classe che possiede funzioni virtuali pure e detta classe
astratta e non e` possibile istanziarla; essa puo` essere utilizzata
unicamente per derivare nuove classi forzandole a fornire determinati metodi
(quelli corrispondenti alle funzioni virtuali pure). Il compito di una classe
astratta e` quella di fornire una interfaccia senza esporre dettagli implementativi.
Se una classe derivata da una classe astratta non implementa una qualche funzione
virtuale pura, diviene essa stessa una classe astratta.
Le classi astratte possono comunque possedere anche attributi e metodi completamente
definiti (costruttori e distruttore compresi) ma non possono comunque essere
istanziate, servono solo per consentire la costruzione di una gerarchia di classi
che rispetti una certa interfaccia:
class TShape {
public:
virtual void Paint() = 0; // ogni figura puo` essere
virtual void Erase() = 0; // disegnata e cancellata!
};
class TPoint : public TShape {
public:
TPoint(int x, int y) : X(x), Y(y) {}
private:
int X, Y; // coordinate del punto
};
void TPoint::Paint() {
/* ... */
}
void TPoint::Erase() {
/* ... */
}
Non e` possibile creare istanze della classe TShape , ma la classe
TPoint ridefinisce tutte le funzioni virtuali pure e puo` essere
istanziata e utilizzata dal programma; la classe TShape e` comunque
ancora utile al programma, perche` possiamo dichiarare puntatori di tale tipo
per gestire una lista di oggetti polimorfi che possiamo utilizzare senza preoccuparci
del fatto che possano essere punti, triangoli o quant'altro.
|