mercoledì 3 settembre 2014

Scenetta al Ristorante del C++. Il vecchio maestro non lavora più e diviene una classe astratta.

Bene.

Il vecchio maestro Cuoco non lavora più, adesso.
Egli dirige solamente il Ristorante del C++, che è di sua proprietà, ma non partecipa più attivamente alle attività di cucina.
Però egli continua ad assumere apprendisti, per i quali stabilisce, ovviamente, prima di assumerli, quali debbano essere le competenze, prendendo a modello le sue.
No, egli non interferisce sul modo in cui ogni apprendista lavora, è solo esigente sui compiti che devono saper svolgere, lasciando poi libertà di fare ognuno nel modo che ritiene più opportuno.

Ecco, egli stabilisce che ognuno deve saper cucinare la pasta con un condimento, poi ognuno può farlo come gli aggrada, seguendo il suo primo Apprendista o facendo diversamente.

Al momento ha un solo apprendista, quell'Antonio...
#include "iostream"
using namespace std;

class Cuoco{
public:
	virtual void Pasta(char * condimento)=0;
};


class Apprendista: public Cuoco{
public:
	void Pasta(char * condimento){
		cout << "Io cucino la pasta nella pentola a pressione con " << condimento << endl;
		getchar();
	}

	void Pasta(char * condimento, char * condimento2){
		cout << "Io cucino la pasta nella pentola a pressione con " << condimento << " e con " << condimento2 << endl;
		getchar();
	}
};


void CucinaPasta(Cuoco * n, char * condimento){
	n->Pasta(condimento);
}

void main(){

	Apprendista * Antonio = new Apprendista();


	CucinaPasta(Antonio, "fagioli");
} 
Io cucino la pasta nella pentola a pressione con fagioli



Adesso ha assunto un altro apprendista, Nicola, il quale decide di seguire le stesse orme di Mario:
.....
void main(){

	Apprendista * Antonio = new Apprendista();
	Apprendista * Nicola = new Apprendista();

	CucinaPasta(Antonio, "fagioli");
	CucinaPasta(Nicola, "ceci");
}
Io cucino la pasta nella pentola a pressione con fagioli

Io cucino la pasta nella pentola a pressione con ceci



Adesso arriva Armando, che invece ha idee diverse, più tradizionaliste: pur cucinando la pasta a due condimenti, è nemico della pentola a pressione, e vuole seguire in tutto e per tutto il modo di lavorare del vecchio: fa parte di una diversa categoria di apprendisti, quelli tradizionalisti.
#include "iostream"
using namespace std;

class Cuoco{
public:
	virtual void Pasta(char * condimento)=0;
};


class Apprendista: public Cuoco{
public:
	void Pasta(char * condimento){
		cout << "Io cucino la pasta nella pentola a pressione con " << condimento << endl;
		getchar();
	}

	void Pasta(char * condimento, char * condimento2){
		cout << "Io cucino la pasta nella pentola a pressione con " << condimento << " e con " << condimento2 << endl;
		getchar();
	}
};

class Apprendista2: public Cuoco{
public:
	void Pasta(char * condimento){
		cout << "Io cucino la pasta con " << condimento << endl;
		getchar();
	}
	void Pasta(char * condimento, char * condimento2){
		cout << "Io cucino la pasta con " << condimento << " e con " << condimento2 << endl;
		getchar();
	}
};



void CucinaPasta(Cuoco * n, char * condimento){
	n->Pasta(condimento);
}


void main(){

	Apprendista * Antonio = new Apprendista();
	Apprendista * Nicola = new Apprendista();
	Apprendista2 * Armando = new Apprendista2();



	CucinaPasta(Antonio, "fagioli");
	CucinaPasta(Nicola, "ceci");
	CucinaPasta(Armando, "sugo");
} 
Io cucino la pasta nella pentola a pressione con fagioli

Io cucino la pasta nella pentola a pressione con ceci

Io cucino la pasta con sugo


Ognuno si implementa nel modo che crede il metodo di cucinare la pasta a un solo condimento, e può, se vuole, cucinare o no la pasta a due condimenti.
L'unica cosa che conta è che lo sappia fare.

Ma in realtà, anche quando il maestro lavorava ognuno aveva sempre la stessa libertà... che differenza c'è?

La differenza è che mentre prima il maestro lavorava e seguiva un suo metodo, lasciando agli altri la scelta se lasciarlo inalterato o modificarlo a proprio piacimento, adesso invece il maestro non lavora, per cui ognuno deve scegliere ex novo come lavorare. Infatti, se proviamo a istanziare il Cuoco, accade questo:
.....
void main(){

	Apprendista * Antonio = new Apprendista();
	Apprendista * Nicola = new Apprendista();
	Apprendista2 * Armando = new Apprendista2();
	Cuoco * Mario = new Cuoco();
}
1>------ Inizio compilazione: Progetto: test15, Configurazione: Debug Win32 ------
1>  foglio1.cpp
1>c:\users\antonello\documents\visual studio 2010\projects\test15\test15\foglio1.cpp(47): error C2259: 'Cuoco': impossibile creare un'istanza di classe astratta
1>          a causa dei seguenti membri:
1>          'void Cuoco::Pasta(char *)': è astratta
1>          c:\users\antonello\documents\visual studio 2010\projects\test15\test15\foglio1.cpp(6): vedere la dichiarazione di 'Cuoco::Pasta'
========== Compilazione: 0 completate, 1 non riuscite, 0 aggiornate, 0 ignorate ==========
Infatti si tratta di una classe astratta!

Nessun commento:

Posta un commento