giovedì 14 agosto 2014

Interfaccia unica implementata da classi derivate di classi astratte completamente diverse.

Se io ho il concetto generico di Animale, da questo concetto generico derivano i concetti particolari di Cavallo, Bue, Gatto, Cane, Asino... Però soltanto alcuni di questi possono essere impiegati per trainare un carro. Inoltre per trainare un carro può essere impiegato anche un Motore, concetto diverso da quello di Animale. Quindi alcune classi di Animali e la classe Motore implementano l'interfaccia Trainatore. Altre classi di Animali, invece, non la implementano, come Cane e Gatto, che non vengono impiegati per trainare nulla.

Anzi posso usare il concetto astratto di VeicoloMotorizzato, di cui fanno parte le classi Trattore, Motoscafo, Aereo, delle quali soltanto la classe Trattore implementa l'interfaccia Trainatore. Ecco un esempio più chiaro che mi aiuta a capire bene a che servono le interfacce: la funzione che mette in opera il trainamento accetta un parametro di tipo puntatore a Trainatore, in modo che le si possa dare in pasto sia una classe derivata dal concetto astratto di Animale, come Cavallo, Bue o Asino, sia una classe derivata dal concetto astratto di VeicoloMotorizzato come Trattore (ma non Cane o Gatto, o, rispettivamente, Motoscato o Aereo, che non implementano l'interfaccia Trainatore)
#include "iostream"
using namespace std;


class Animale{
public:
 virtual void muoviti()=0;
 virtual void verso() =0;
 
};

class Trainatore{
public:
 virtual void azione()=0;
};

class Cavallo:public Animale,public Trainatore{
 void muoviti(){
  cout << "io galoppo" << endl;
  getchar();
 }
 void verso(){
  cout << "io nitrisco" << endl;
  getchar();
 }
 void azione(){
  cout << "io traino il carro velocemente" << endl;
  getchar();
 }
};

class Bue:public Animale,public Trainatore{
 void muoviti(){
  cout << "io cammino" << endl;
  getchar();
 }
 void verso(){
  cout << "io muggisco" << endl;
  getchar();
 }
 void azione(){
  cout << "io traino il carro lentamente" << endl;
  getchar();
 }
};

class Gatto:public Animale{
public:
 void muoviti(){
  cout << "io cammino felpato" << endl;
  getchar();
 }
 void verso(){
  cout << "io miagolo" << endl;
  getchar();
 }
};
class VeicoloMotorizzato{
public:
 virtual void carburante()=0;
 virtual void mezzo()=0;
};

class Motoscafo:public VeicoloMotorizzato{
 void carburante(){
  cout << "benzina" << endl;
  getchar();
 }
 void mezzo(){
  cout << "mare" << endl;
  getchar();
 }
};

class Aereo:public VeicoloMotorizzato{
 void carburante(){
  cout << "kerosene" << endl;
  getchar();
 }
 void mezzo(){
  cout << "aria" << endl;
  getchar();
 }
};

class Trattore:public VeicoloMotorizzato,public Trainatore{
 void carburante(){
  cout << "gasolio" << endl;
  getchar();
 }
 void mezzo(){
  cout << "campagna" << endl;
  getchar();
 }
 void azione(){
  cout << "traino il carro molto velocemente" << endl;
  getchar();
 }
};

void trazione(Trainatore * anim){
 anim->azione();
}

void main(){
 Cavallo Furia;
 Bue Filippo;
 Gatto Silvestro;
 Aereo Jumbo;
 Motoscafo Barchetta;
 Trattore Nicolino;

 trazione(&Furia);
 trazione(&Filippo);
 trazione(&Nicolino);
} 
io traino il carro velocemente

io traino il carro lentamente

traino il carro molto velocemente


Nessun commento:

Posta un commento