защищенное наследование против публичного наследования и ОО дизайн - PullRequest
1 голос
/ 13 марта 2009

Когда вы используете каждое наследство?

class Base{};

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

Мой случай:

У меня есть класс с именем Snapshot, который содержит только методы 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 другом Snapshot, поскольку я не хочу
      ввести сеттеры.

Ответы [ 4 ]

2 голосов
/ 13 марта 2009

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

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

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

2 голосов
/ 13 марта 2009

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

Основная проблема заключается в семантике - является ли что-то ЧЕМ-ТО или что-то - РЕАЛИЗОВАНО В УСЛОВИЯХ.

0 голосов
/ 13 марта 2009

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

0 голосов
/ 13 марта 2009

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

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

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