Доступ к подклассу в шаблоне Factory - PullRequest
2 голосов
/ 28 июля 2011

У меня есть вопрос, основанный на дизайне, где я хочу избежать 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. Я ввел special_variable в Prod_X, потому что это был атрибут Prod_X, а не Prod в целом. Это правильно?
  2. класс O в основном использует интерфейс класса Prod, чтобы делать в основном все. Но для этой специальной переменной O_derived_X заинтересован в ее правильной настройке.

Не могли бы вы подсказать, где я иду не так? Или как я могу реорганизовать код?

1 Ответ

1 голос
/ 28 июля 2011

В идеальном дизайне общедоступные классы имеют отношение " является ", а не " является расширением " в том смысле, что они могут быть расширены, но вы не замечаете этого с точки зрения интерфейса. Это лучше всего достигается, если вы на самом деле приказываете объектам делать что-то , а вы не получаете / не устанавливаете их. В этом случае фабрики могут просто создавать то, что нужно, и клиентам не нужно знать фактический класс (полиморфизм).

Это не всегда возможно / просто, так что приведение может быть решением, но вы можете утверждать, что в этом случае может не потребоваться фабрика (O_derived_X может создать сам объект Prod_X).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...