采用木质或钢质材料设计的桌子。我有以下设计,哪个更好,为什么?或者更好的建议设计?
设计1:
class Meterial{
public:
void virtual info()=0;
};
class Wood:public Meterial{
public:
void info();
};
void Wood::info(){
cout<<"wood"<< " ";
}
class Steel:public Meterial{
public:
void info();
};
void Steel::info(){
cout<<"steel"<< " ";
}
class Furniture{
void virtual info()=0;
};
class Table:public Furniture{
private:
Meterial * _meterial;
public:
Table(Meterial * m);
void info();
};
Table::Table(Meterial * m){
_meterial= m;
}
void Table::info(){
_meterial->info();
cout<< " table " << endl;
}
int main(){
Table * wood_table=new Table(new Wood());
Table * steel_table=new Table(new Steel());
wood_table->info();
steel_table->info();
}
设计2:
class Meterial{
public:
virtual void info()=0;
};
class Wood:public Meterial{
public:
void info();
};
void Wood::info(){
cout<<" wood " << " ";
}
class Steel:public Meterial{
public:
void info();
};
void Steel::info(){
cout<<" Steel " << " ";
}
class Furniture{
public:
virtual void info()=0;
};
class Table:public Furniture{
public:
void info();
};
void Table::info(){
cout<<" table "<< endl;
}
class WoodTable:public Wood,public Table{
public:
void info();
};
void WoodTable::info(){
Wood::info();
Table::info();
}
class SteelTable:public Steel,public Table{
public:
void info();
};
void SteelTable::info(){
Steel::info();
Table::info();
}
int main(){
WoodTable *woodTable = new WoodTable();
SteelTable *steelTable = new SteelTable();
woodTable->info();
steelTable->info();
}
谢谢!
答案 0 :(得分:3)
如果您有非常具体的理由,或者当所有其他选项都不是更好或更差时,您应该只使用继承。永远不要继承以便重复使用。
材料是否有可以动态更改的行为?表格的材料可以在运行时更改吗?如果其中任何一个的答案都是肯定的,那么您可能需要运行时多态性和继承。您的第一个设计是朝着正确方向迈出的一大步。然而,你的第二个设计风险很大,并没有给桌子带来任何影响(原谅双关语)。多重继承?为什么?您应该有一个非常具体,坚实的理由来使用多重继承。
另一种设计方法是使用编译时多态性。
struct wood { };
struct steel { };
template<class M>
struct table { };
// ...
table<wood> wood_table;
答案 1 :(得分:1)
想想“是一个”和“有一个”之间的区别。表具有材质属性,表本身不是材质。我会选择第一个。