2009-03-13 2 views
1

Когда вы используете каждое наследование?защищенное наследование против общего наследования и дизайна OO

class Base{}; 

class Derived: protected Base{}; 
class Derived2: public Base{}; 

Мой случай:

я класс, называемый моментальный снимок, который содержит только методы GetXXX. Это легкий класс, используемый для хранения текущего состояния класса Value. Я также использую его для восстановления, сохраняя экземпляры этого класса долго после того, как экземпляр класса Value исчез. Класс Manager обрабатывает экземпляры класса Snapshot. Позвольте мне показать вам код:

class Snapshot 
{ 
     public: 
      Snapshot (const Snapshot * snap) 
      { 
       _x=snap->_x; 
       _y=snap->_y; 
       _z=snap->_z; 
      } 
      Snapshot(){_x=_y=_z=0;} 
      int GetX(){return _x;} 
      int GetY(){return _y;} 
      int GetZ(){return _z;} 
      ~virtual Snapshot(){} 

     protected: 
      int _x,_y,_z;    
}; 

class Value:public Snapshot 
{ 

/*Very heavy class with a lot of components used to calculate _x, _y, _z*/ 


}; 


class Manager 
{ 
     public: 
     void Process(const Snapshot * snap) 
     { 

     } 
}; 

Как вы относитесь к этому дизайну? Каковы альтернативы?

Благодаря

решения и вопросы

  • Решение: Я хотел бы создать функцию makeSnapshot которая будет возвращать объект Snapshot данным объектом Value.

  • Вопросы:

    • главная проблема: я послал снимки на очень часто (каждый второй, даже меньше), поэтому я не хочу брать на себя строительство и уничтожение стоимости небольшая проблема:

    • полуобщественный вопрос Мне нужно сделать Value другом снимка, так как я не хочу, чтобы
      вводили сеттеры.

+0

«... строительство и разрушение стоят незначительно ...», как вы собираетесь создавать снимки, не создавая их? Собираются ли передавать значения вместо снимка? –

+0

Я считаю, что вашего описания недостаточно, поскольку представленный пример и ваши объяснения в комментариях кажутся немного запутанными. – Anonymous

+0

@ Микола точно: я передаю значение и снимок взаимозаменяемо. @unknown (google) что не понимают в дизайне? Я расскажу больше, если что-то конкретное неясно. – 2009-03-13 15:37:13

ответ

0

Вообще говоря, я бы использовал публичное наследование, если я хочу реализовать определенный интерфейс, например. если мой класс должен получить доступ к определенному контракту. Защищенное наследование может использоваться, если вы просто хотите повторно использовать функциональность, реализованную в родительском.

Я бы сделал Snapshot чистым виртуальным классом, например.просто интерфейс, а Value будет реализовывать методы getXYZ. Например. вам, вероятно, не нужны элементы _x, _y, _z в Snapshot.

+0

в восстановлении Я использую экземпляры класса снимков ... – 2009-03-13 15:06:17

2

Что касается вопроса о частном и защищенном наследовании, то довольно подробное объяснение можно найти здесь:

Основная проблема - это семантика - есть ли что-то IS-что-то, или что-то НЕОБХОДИМЫЕ-В-ТЕРМИНЫ.

+0

это одно: это что-то, и оно что-то использует :) – 2009-03-13 14:55:44

2

Я бы создал функцию makeSnapshot, которая вернет объект Snapshot заданным объектом Value.

Вам действительно нужно, чтобы значение было снимком?

Также вы можете рассмотреть шаблон дизайна GOF «Memento».

+0

Я, хотя об этом, и он представляет две проблемы: Основная проблема: я отправлял снимки очень часто (каждую секунду, даже меньше), следовательно, t хотят понести расходы на строительство и уничтожение второстепенная проблема: мне нужно сделать Value другом моментального снимка, так как я не хочу вводить сеттеры. thx – 2009-03-13 14:57:59

+0

Итак, где Memento не мясо ваши требования? –

+0

прочитал его еще раз ... – 2009-03-13 15:05:22

0

Цвет me Luddite, но за более чем 20 лет программирования на C++ я никогда не использовал защищенное или частное наследование и никогда не видел примера их использования, которое не могло бы быть сделано лучше с использованием какой-либо другой языковой функции (обычно сдерживания) ,

+0

Я видел частное много раз, но защищал пах от нескольких патологий;) – Anonymous

+0

То же самое здесь, никогда не видел защищенного наследования, хотя мой опыт не хватает 20 лет :)) – 2009-03-13 15:38:06

+0

Редко, но я могу придумать несколько причин для частного наследования. Защищенный, однако, я никогда не видел. – rlbond

Смежные вопросы