#include <iostream>
/** INTERFACCIA:
* Definisce un interfaccia che può avere più implementazioni possibili.
*/
class ICallable{ //in C++ non esistono le "interfacce" come in altri linguaggi,
//ma possiamo usare classi "pure abstract" facendo finta che
//che siano interfacce
public:
virtual void doSomething() = 0; // metodo interfaccia da implementare
};
/** Funzione che agisce sull'interfaccia (non conosce le implementazioni)*/
void executeCallable(ICallable * p){
p->doSomething();
}
class HelloWorldCallable: public virtual ICallable{
public:
/** IMPLEMENTA ICallable,
* Stampa "Hello World" a schermo. */
virtual void doSomething() override{
std::cout<<"Hello World"<<std::endl;
}
virtual ~HelloWorldCallable(){} //distruttore virtuale, obbligatorio
};
class SayGoodbyeCallable: public virtual ICallable{
public:
/** IMPLEMENTA ICallable,
* Stampa "Say Goodbye" a schermo. */
virtual void doSomething() override{
std::cout<<"Say Goodbye"<<std::endl;
}
virtual ~SayGoodbyeCallable(){} //distruttore virtuale, obbligatorio
};
int main(){
//creo 2 oggetti diversi
SayGoodbyeCallable * goodbye = new SayGoodbyeCallable();
HelloWorldCallable * hello = new HelloWorldCallable();
// ma grazie all'interfaccia in comune posso usarli entrambi nella stessa funzione.
executeCallable( goodbye );
executeCallable( hello );
//elimino ciò che non serve più.
delete goodbye;
delete hello;
return 0;
}