ОО дизайн, дизайн стола - PullRequest
       4

ОО дизайн, дизайн стола

0 голосов
/ 24 февраля 2011

Дизайнерский стол из дерева или стали.У меня есть следующий дизайн, который лучше и почему?Или какой-нибудь лучший дизайн предложения?

дизайн 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 ]

3 голосов
/ 24 февраля 2011

Вы должны использовать наследование только тогда, когда у вас есть очень конкретные причины, или когда все другие варианты не лучше и не хуже.Никогда не наследуйте для повторного использования.

Имеет ли материал какое-либо поведение , которое может динамически изменяться?Может ли материал таблицы меняться во время выполнения?Если ответ на любой из этих вопросов положительный, вам, вероятно, понадобится полиморфизм и наследование во время выполнения.Ваш первый дизайн - это хороший шаг в правильном направлении.Ваш второй дизайн, однако, является рискованным и приносит мало на стол (и простите за каламбур).Множественное наследование?Зачем?У вас должна быть очень конкретная и веская причина для использования множественного наследования.

Другой альтернативой разработки является использование полиморфизма во время компиляции.

struct wood { };
struct steel { };

template<class M>
struct table { };

// ...
table<wood> wood_table;
1 голос
/ 24 февраля 2011

Подумайте о разнице между «есть» и «имеет».Таблица имеет свойство материала, сама таблица не является материалом.Я бы пошел с первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...