Qui abbiamo la classe TV e la classe DVD come esempio:
class TV
{
public:
TV();
virtual ~TV();
void on() const;
void off() const;
};
class DVDPlayer
{
public:
DVDPlayer();
~DVDPlayer();
void SetCD() const;
void StartPlay() const;
void Eject() const;
void PowerOff() const;
};
Creiamo Adapter che aiuta il DVD a "fingere" la TV:
class TVStyleAdapter :
public TV
{
public:
TVStyleAdapter(DVDPlayer* AdapteeDVD);
~TVStyleAdapter();
void on() const;
void off() const;
private:
DVDPlayer* DVD;
};
// override base class funcs:
void TVStyleAdapter::on() const
{
DVD->SetCD();
DVD->StartPlay();
}
void TVStyleAdapter::off() const
{
DVD->Eject();
DVD->PowerOff();
}
Dopo posso aggiungere "virtuale" nella classe TV (Base) & sovrascrivere le funzioni on () off () nella classe Adapter. E funzionerà correttamente.
MA le domande sono:
- Possiamo in qualche modo creare un adattatore senza NESSUNA modifica (ad esempio aggiungendo "virtuale") in una classe di base ("TV")?
- È possibile in questa situazione non violare l'Open Closed principio?
- Se presumo di utilizzare un adattatore nel mio programma in futuro, dovrei fare i metodi virtuali nelle mie classi in anticipo?