C++ 工厂模式中特定于子类的访问
我有一个基于设计的问题,我想避免动态转换,但仍然想知道如何实现松耦合C++ 工厂模式中特定于子类的访问,c++,design-patterns,C++,Design Patterns,我有一个基于设计的问题,我想避免动态转换,但仍然想知道如何实现松耦合 class Prod { // Prod has lot of subclasses public: void method() {//Some Implementation } }; class Prod_X : Prod { int special_variable; public: void method()
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();
}
};
类Prod{//Prod有很多子类
公众:
void方法()
{//一些实现
}
};
类别Prod_X:Prod
{
int特殊_变量;
公众:
void方法()
{//覆盖基
}
void setSpecialVariable()
{//Set特殊变量
}
};
阶级工厂
{
公众:
产品*创建(字符串和s)
{if(s==“X”)返回新的Prod_X;//依此类推
};
};
O类
{
公众:
Factory F;//假设我们讨论的是一个简单的工厂模式
产品*创建(字符串和s)
{p=F.create(s);返回p;}
Prod*p;
};
//这里的问题是关于耦合以及如何避免动态强制转换
//O_派生_X的继承产品成员始终是Prod_X(由工厂负责)
类O_派生的_X{
int特殊_变量;
公众:
void setSpecialVariable()
{//需要设置Prod_X变量
Prod_X*px=动态铸造(p);
px->setSpecialVariable();
}
};
两件事
你能告诉我哪里出了问题吗?或者如何重构代码?在理想的设计中,公开继承的类有一个“是一个”关系,而不是“是一个”关系的扩展,因为它们可能会被扩展,但从接口的角度看,你不会注意到这一点。如果您实际命令对象执行某项操作,而您没有获取/设置对象,则可以最好地实现这一点。在这种情况下,工厂可以创建所需的内容,而客户机不需要知道实际的类(多态性)
这并不总是可能/容易的,因此强制转换可能是解决方案,但您可以争辩说,在这种情况下可能不需要工厂(O_派生的_X可以自己创建一个Prod_X对象)。没有必要使用
动态强制转换
,您可以使用静态强制转换
。但不是静态强制转换(也是动态强制转换)将导致未定义的行为{See[link]()}No UB,因为您知道'p'的动态类型。既然你肯定知道,就没有必要去投。在这里,static_cast是您的朋友;无论是cast,还是生成特定产品的另一个create()方法,但您需要一些东西。你熟悉COM吗?这里有接口、实现接口的类和类对象或工厂,它们知道如何创建类实例。但是还有一个QueryInterface
方法,它允许您获取指向对象实现的另一个接口的指针。它是怎么做到的?铸造