如何设计以下类继承?

时间:2015-09-01 07:41:43

标签: c++ oop inheritance

我面临着类继承设计的问题。它在 C ++ 中显示如下:

有两种类,我们先称它们为ObjectComponent。 类Object使用类Component,但子类出现问题。

简单来说,有6个班级。

class BaseComponent{...};
class ComponentA: public BaseComponent{...};
class ComponentB: public BaseComponent{...};

class BaseObject {
public:
    virtual bool doSomething()=0;
    void setBaseComponent(BaseComponent*c){_c = c;}
    BaseComponent* getBaseComponent()   {return _c;}
private:
    BaseComponent* _c;
}
class ObjectA : public BaseObject {
public:
    bool doSomething(){ /*do someting related to ComponentA*/}
    void setComponentA(ComponentA* a)   {setBaseComponent(a);}
    ComponentA* getComponentA()         
    {return static_cast<ComponentA*>(getBaseComponent());}
}
class ObjectB : public BaseObject {
public:
    bool doSomething(){ /*do someting related to ComponentB*/}
    void setComponentB(ComponentB* b)   {setBaseComponent(b);}
    ComponentB* getComponentB()         
    {return static_cast<ComponentB*>(getBaseComponent());}
}

现在出现了问题:

如果我喜欢上面的代码,我必须始终检查类关系。

(例如,我必须在使用ObjectB::getComponentB()时检查static_cast中的真实课程)

如果我更改代码并直接在ComponentA中使用ObjectA,我将放弃“依赖性反转”,这会使代码不方便。

那么,有人可以给我一些建议吗?

2 个答案:

答案 0 :(得分:0)

因此BaseObject的任何子类总是需要匹配的BaseComponent子类?

使BaseObject中的setter受到保护。它声称你可以给任何对象提供任何组件,并且如果除了他们之外的任何人都可以访问该setter,那么子类就不会坚持这一承诺。

更好的做法是使组件成为构造函数参数,如果可能的话。

答案 1 :(得分:0)

使用接口而不是具体类的想法是,当您使用接口的指针时,您不必担心后面的内容。

如果你要退回具体的$http.get('/data/contacts.json')ComponentA,那么你就失去了它。

然后,IMO,您应该更改这些具体类,以便能够返回ComponentB的指针,然后您将不需要static_cast。