我有一个基于设计的问题,我想避免使用dynamic_cast但仍想知道如何进行松耦合。
class Prod { // Prod has lot of subclasses
public:
void method()
{//Some Implementation
}
};
class Prod_X : Prod
{
int special_variable;
public:
void method()
{//Override Base
}
void setSpecialVariable()
{//Set Special Variable
}
};
class Factory
{
public:
Prod* create(string &s)
{ if (s == "X") return new Prod_X; //And so on
};
};
class O
{
public:
Factory F; // Assume we are talking about a simple factory pattern
Prod* create(string &s)
{ p = F.create(s); return p;}
Prod* p;
};
// Issue is here on coupling and how to avoid dynamic_cast
// Inherited Prod member for O_derived_X is always Prod_X (Factory takes care of that)
class O_derived_X {
int special_variable;
public:
void setSpecialVariable()
{ // Need to set Prod_X Variable
Prod_X *px = dynamic_cast<Prod_X*>(p);
px->setSpecialVariable();
}
};
两件事
答案 0 :(得分:1)
在理想设计中,公开继承的类具有“是”关系,而不是“是的扩展”关系从界面的角度来看,它们可以被扩展,但你没有注意到它。如果您实际订购了做某事并且未获取/设置这些对象,则可以获得最佳效果。在这种情况下,工厂可以创建所需的东西,客户不需要知道实际的类(多态)。
这并不总是可行/容易,因此强制转换可能是解决方案,但你可能会认为在这种情况下可能不需要工厂(O_derived_X本身可以创建一个Prod_X对象)。