Sto creando un programma di editing vettoriale in C ++ e ho bisogno di un'interfaccia Shape che altre classi concrete implementeranno. È richiesto che nessuna ereditarietà dell'implementazione sia consentita. Il documento di progettazione dice che se hai bisogno di polimorfismo, usa le interfacce . Se hai bisogno di riutilizzo del codice, utilizza la composizione .
L'interfaccia Forma è:
class Shape
{
public:
virtual void get_name()=0;
virtual void set_name()=0;
virtual void get_linewidth()=0;
virtual void set_linewidth()=0;
...
...about 20 other getters/setters
...
virtual void draw()=0;
virtual int area()=0;
virtual void rotate(int angle)=0;
}
La classe Circle:
class Circle: public Shape
{
string name;
int line_width;
int angle_of_rotation;
int radius;
public:
string get_name(){ return name; }
string set_name(string name){ this->name=name; }
...
...about 20 other getters/setters
...
int area()
{
return PI*pow(this->radius,2);
}
}
Non ho alcun problema con questo, eccetto che le proprietà comuni devono essere ripetute per ogni tipo di forma ! Questo è risolto usando l'ereditarietà, ma io non posso usarlo .
Quindi, creo una classe ShapeProperties
class ShapeProperties
{
string name;
int line_width;
int angle_of_rotation;
public:
string get_name(){ return name; }
string set_name(string name){ this->name=name; }
...
...about 20 other getters/setters
...
}
e un metodo properties () per l'interfaccia:
virtual ShapeProperties* properties()=0;
Un utente farebbe quindi:
Shape *shape = new Circle();
shape->properties()->set_name("my shape");
shape->properties()->set_line_width(4);
int area = shape->area();
La mia domanda: questo buon design? Questo cattivo design? Ci sono problemi evidenti? Come potrebbe essere migliorato?