木质或钢质设计台面。我有以下设计,哪一个更好,为什么?或者有更好的建议设计?
设计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();
}谢谢!
发布于 2011-02-24 07:12:26
只有当你有一个非常具体的原因,或者当所有其他选项都不是更好或更坏的时候,你才应该使用继承。永远不要为了重用而继承。
材料有没有可以动态变化的行为?表的材料可以在运行时更改吗?如果其中任何一个的答案都是肯定的,那么您可能需要运行时多态性和继承。那么你的第一个设计就是朝着正确方向迈出的一大步。然而,您的第二个设计是有风险的,并且几乎没有带来什么(请原谅我的双关语)。多重继承?为什么?你应该有一个非常具体、可靠的理由来使用多重继承。
另一种设计方案是使用编译时多态性。
struct wood { };
struct steel { };
template<class M>
struct table { };
// ...
table<wood> wood_table;发布于 2011-02-24 07:03:47
想想"is a“和"has a”之间的区别。表具有材质属性,表本身不是材质。我会选择第一个。
https://stackoverflow.com/questions/5098373
复制相似问题