工厂模式中的子类特定访问权限

时间:2011-07-28 12:47:25

标签: c++ design-patterns

我有一个基于设计的问题,我想避免使用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(); 
      } 
 };

两件事

  1. 我在Prod_X中引入了special_variable,因为它是Prod_X的一个属性而不是Prod。这是对的吗?
  2. class O基本上使用类Prod的接口来做大部分事情。但是,对于这个特殊变量,O_derived_X有兴趣正确设置它。
  3. 你可以告诉我哪里出错吗?或者我如何重构代码?

1 个答案:

答案 0 :(得分:1)

理想设计中,公开继承的类具有“”关系,而不是“的扩展”关系从界面的角度来看,它们可以被扩展,但你没有注意到它。如果您实际订购了做某事并且未获取/设置这些对象,则可以获得最佳效果。在这种情况下,工厂可以创建所需的东西,客户不需要知道实际的类(多态)。

这并不总是可行/容易,因此强制转换可能是解决方案,但你可能会认为在这种情况下可能不需要工厂(O_derived_X本身可以创建一个Prod_X对象)。