我面临着类继承设计的问题。它在 C ++ 中显示如下:
有两种类,我们先称它们为Object
和Component
。
类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
,我将放弃“依赖性反转”,这会使代码不方便。
那么,有人可以给我一些建议吗?
答案 0 :(得分:0)
因此BaseObject
的任何子类总是需要匹配的BaseComponent
子类?
使BaseObject
中的setter受到保护。它声称你可以给任何对象提供任何组件,并且如果除了他们之外的任何人都可以访问该setter,那么子类就不会坚持这一承诺。
更好的做法是使组件成为构造函数参数,如果可能的话。
答案 1 :(得分:0)
使用接口而不是具体类的想法是,当您使用接口的指针时,您不必担心后面的内容。
如果你要退回具体的$http.get('/data/contacts.json')
和ComponentA
,那么你就失去了它。
然后,IMO,您应该更改这些具体类,以便能够返回ComponentB
的指针,然后您将不需要static_cast。