OO设计,表设计

时间:2011-02-23 22:59:55

标签: c++ design-patterns object

采用木质或钢质材料设计的桌子。我有以下设计,哪个更好,为什么?或者更好的建议设计?

设计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();
}

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您有非常具体的理由,或者当所有其他选项都不是更好或更差时,您应该只使用继承。永远不要继承以便重复使用。

材料是否有可以动态更改的行为?表格的材料可以在运行时更改吗?如果其中任何一个的答案都是肯定的,那么您可能需要运行时多态性和继承。您的第一个设计是朝着正确方向迈出的一大步。然而,你的第二个设计风险很大,并没有给桌子带来任何影响(原谅双关语)。多重继承?为什么?您应该有一个非常具体,坚实的理由来使用多重继承。

另一种设计方法是使用编译时多态性。

struct wood { };
struct steel { };

template<class M>
struct table { };

// ...
table<wood> wood_table;

答案 1 :(得分:1)

想想“是一个”和“有一个”之间的区别。表具有材质属性,表本身不是材质。我会选择第一个。