受保护的继承与公共继承和OO设计

时间:2009-03-13 14:43:42

标签: c++ oop

您何时使用每个继承?

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函数,该函数将通过给定的Value对象返回Snapshot对象。

  • 问题:

    • 主要问题:我经常发送快照(每秒,甚至更少),因此我不想承担构建和销毁成本的小问题:

    • 半主要问题我必须让Value成为Snapshot的朋友,因为我不想要 介绍二传手。

4 个答案:

答案 0 :(得分:2)

关于私有和受保护的继承的问题,可以在这里找到非常详尽的解释:

主要问题是语义 - 无论是某种东西是某种东西,还是某种东西都是以某种方式实现的。

答案 1 :(得分:2)

我将创建makeSnapshot函数,该函数将通过给定的Value对象返回Snapshot对象。

你真的需要Value作为快照吗?

你也可以考虑GOF设计模式“Memento”。

答案 2 :(得分:0)

一般来说,如果我想实现特定的接口,我会使用公共继承,例如:如果要通过特定合同访问我的课程。 如果您只想重用父级中实现的功能,则可以使用受保护的继承。

我会将Snapshot设为纯虚拟类,例如只是一个接口,Value将实现getXYZ方法。例如。你可能不需要快照中的_x,_y,_z成员。

答案 3 :(得分:0)

给我看Luddite,但是在20多年的C ++编程中,我从未使用过保护或私有继承,并且从未见过使用其他语言功能(通常是包含)无法更好地使用它们的示例。