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つのこと
- それはProd_Xの属性だったと一般的にはPRODいないので、私はProd_Xでspecial_variableを導入しました。これは正しいですか?
- クラスOは基本的にすべてのことを行うためにProdクラスのインターフェイスを使用します。しかし、この特別な変数については、O_derived_Xは正しく設定することに興味があります。
どこが間違っているのでしょうか?または、コードをどのようにリファクタリングすることができますか? 理想的な設計で
'dynamic_cast'の必要はありません。単に' static_cast'を使うだけです。 –
しかし、static_cast(dynamic_castも)は未定義の動作になりません({link [http://stackoverflow.com/questions/6322949/downcasting-using-the-static-cast-in-c}}を参照)。 – jmishra
「p」の動的タイプが何であるか知っているので、UBはありません。確かに分かっているので、dynamic_castを行う必要はありません。 static_castはあなたの友人です。 – rodrigo