Certo, questo è un problema di compiti a casa, ma ho cercato di capirlo da solo. Voglio solo assicurarmi di averlo corretto. Finora, l'unico modello di progettazione che ritengo sia corretto sarebbe il modello di progettazione dell'adattatore. Potrei implementare una classe Adapter per ereditare pubblicamente dalla classe C e privatamente dalla classe D e istanziare quanto segue:
D *d = new Adapter();
d->foo();
Tuttavia, si qualificherebbe come sottotitoli?
Il problema:
Supponiamo di avere la seguente classe:
class C { /* ... */ public: int foo (); int bar (); };
Supponiamo anche che questa classe sia disponibile solo in forma compilata, cioè che non possa essere modificata. Adesso
vogliamo aggiungere un'implementazione alternativa che abbia solo un metodo foo()
ma che non ha un
metodo bar()
e non eredita i membri dati dalla classe C. I.e., questa nuova classe D avrebbe
la struttura
class D /* ... */ { public: int foo (); };
ma non può ereditare dalla classe C.
Supponiamo di voler mantenere un elenco di oggetti che possono essere delle classi C o D. Spiegare come
puoi progettare questa struttura dati dell'elenco, attraversare l'elenco e chiamare foo()
su ogni elemento, in modo tale che il
metodo appropriato C::foo()
o D::foo()
viene eseguito a seconda del tipo dell'oggetto. Fare
non utilizzare le istruzioni if o la sottotipizzazione strutturale.