Ho trovato la seguente domanda su un sito web per le interviste:
Here are 3 products: table, chair and bench. Product can be of material: wood, metal, and plastic. Design class structures for this.
Il mio primo pensiero è stato quello di avere un prodotto di classe astratta con un membro della classe Materiale protetto, come mostrato di seguito. La mia domanda attuale è dopo il blocco di codice qui sotto
#include <stdio.h>
#include <string>
using namespace std;
class Type {
public:
// Commented out virtual below. Was a typo !
/*virtual*/void SetType(string s) {
m_typeName = s;
}
virtual void PrintType() {
printf("Type = %s\n",m_typeName.c_str());
}
virtual ~Type()=0;
Type& operator=(const Type& rhs) {
if ( &rhs != this ) {
m_typeName = rhs.m_typeName;
}
return *this;
}
private:
string m_typeName;
};
Type::~Type() {}
class Wood: public Type {
};
class Plastic: public Type {
};
class Product {
public:
Product():m_type(NULL) {
}
virtual void SetType(Type* t){
m_type = t;
}
virtual void PrintInfo() {
printf("I am %s product\n",m_productName.c_str());
m_type->PrintType();
}
virtual ~Product()=0;
protected:
string m_productName;
Type* m_type;
};
Product::~Product() {}
class Table: public Product {
public:
Table() {
m_productName = "table";
}
};
class Chair: public Product {
public:
Chair() {
m_productName = "chair";
}
};
int main()
{
Plastic *p = new Plastic();
p->SetType("plastic");
Table *t = new Table();
t->SetType(p);
t->PrintInfo();
delete t;
delete p;
return 0;
}
Tuttavia, ho la sensazione che potrebbe essere progettato meglio.
In generale, se le tue composizioni (Prodotto nell'esempio) contengono composizioni (Materiale nell'esempio), qual è un buon modello di progettazione?