Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 工厂模式中特定于子类的访问_C++_Design Patterns - Fatal编程技术网

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();
} 
};
两件事

  • 我在Prod_X中引入了特殊的_变量,因为它是Prod_X的一个属性,而不是一般的Prod。是这样吗
  • 类O基本上使用类Prod的接口来完成大部分工作。但是,对于这个特殊变量,O_派生的X感兴趣的是正确设置它

  • 你能告诉我哪里出了问题吗?或者如何重构代码?

    在理想的设计中,公开继承的类有一个“是一个”关系,而不是“是一个”关系的扩展,因为它们可能会被扩展,但从接口的角度看,你不会注意到这一点。如果您实际命令对象执行某项操作,而您没有获取/设置对象,则可以最好地实现这一点。在这种情况下,工厂可以创建所需的内容,而客户机不需要知道实际的类(多态性)


    这并不总是可能/容易的,因此强制转换可能是解决方案,但您可以争辩说,在这种情况下可能不需要工厂(O_派生的_X可以自己创建一个Prod_X对象)。

    没有必要使用
    动态强制转换
    ,您可以使用
    静态强制转换
    。但不是静态强制转换(也是动态强制转换)将导致未定义的行为{See[link]()}No UB,因为您知道'p'的动态类型。既然你肯定知道,就没有必要去投。在这里,static_cast是您的朋友;无论是cast,还是生成特定产品的另一个create()方法,但您需要一些东西。你熟悉COM吗?这里有接口、实现接口的类和类对象或工厂,它们知道如何创建类实例。但是还有一个
    QueryInterface
    方法,它允许您获取指向对象实现的另一个接口的指针。它是怎么做到的?铸造