首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OO设计,表格设计

OO设计,表格设计
EN

Stack Overflow用户
提问于 2011-02-24 06:59:55
回答 2查看 764关注 0票数 0

木质或钢质设计台面。我有以下设计,哪一个更好,为什么?或者有更好的建议设计?

设计1:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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();
}

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-24 07:12:26

只有当你有一个非常具体的原因,或者当所有其他选项都不是更好或更坏的时候,你才应该使用继承。永远不要为了重用而继承。

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

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

代码语言:javascript
运行
复制
struct wood { };
struct steel { };

template<class M>
struct table { };

// ...
table<wood> wood_table;
票数 3
EN

Stack Overflow用户

发布于 2011-02-24 07:03:47

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5098373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档