2011-07-28 8 views
2

私は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(); 
     } 
}; 

2つのこと

  1. それはProd_Xの属性だったと一般的にはPRODいないので、私はProd_Xでspecial_variableを導入しました。これは正しいですか?
  2. クラスOは基本的にすべてのことを行うためにProdクラスのインターフェイスを使用します。しかし、この特別な変数については、O_derived_Xは正しく設定することに興味があります。

どこが間違っているのでしょうか?または、コードをどのようにリファクタリングすることができますか? 理想的な設計

+2

'dynamic_cast'の必要はありません。単に' static_cast'を使うだけです。 –

+0

しかし、static_cast(dynamic_castも)は未定義の動作になりません({link [http://stackoverflow.com/questions/6322949/downcasting-using-the-static-cast-in-c}}を参照)。 – jmishra

+0

「p」の動的タイプが何であるか知っているので、UBはありません。確かに分かっているので、dynamic_castを行う必要はありません。 static_castはあなたの友人です。 – rodrigo

答えて

1

、公に継承されたクラスが関係し、「ある」持たない「の拡張である」彼らは延長することができるという意味で関係が、あなたはそれに気づくことはありません。インタフェースの視点からこれは、実際にオブジェクトをに、を、そしてを設定しないと、最も効果的です。その場合、工場は必要なものを作成するだけで、クライアントは実際のクラス(多型性)を知る必要はありません。

これは必ずしも可能ではないので、キャスティングが解決策になるかもしれませんが、その場合は工場が必要でないかもしれないと主張できます(O_derived_XはProd_Xオブジェクト自体を作成する可能性があります)。

関連する問題