2012-05-11 2 views
2

私は最良の方法で処理する方法がわからないという設計上の問題があります。私は自分のコードを将来的に証明し、まだまだ複雑で複雑ではない(オタクの苦境)ようにしたい。dynamic_castとポリモーフィズムのベストプラクティス

現在、私のデザインは次のセットアップ

derived class D   derived class E 
^      ^
    |       | 
derived abstract class B ->    derived class C 
^          ^
    |           | 
       Abstract Base class A 

クラスBは、クラスBCからクラスDとクラスE異なり、クラスA異なり、クラスA異なっています。

これらのクラスが異なるため、dynamic_cast演算子を使用する必要があります。

A* a1 = new class C; 
C* c1 = dynamics_cast<C*>(a1); 
if(c1){ //Success!!!} 
... 

あなたは、私は多くのことをdynamic_cast使用したいことでしょう見ることができるように!私はこれを行う良い方法を見つけようとする必要があります。それはif()ステートメントがいっぱいではありません。

これを行うためのすてきな方法はありますか?私はScott Meyersの本で何かを見ているのを覚えているようですが、私は家から離れており、1〜2週間はアクセスできません。

いずれの参考文献も参考にしてください。必要であれば

また、私は解決策

B* d1 = new D; 
B* e1 = new E; 

ではなく、理想的なの一種だろうインターフェイスにクラスBを作ることができます。

注:私は私の現在の設計の失敗

class A {...}; 

class B: public A { 
    public: 
     virtual std::vector<objectType1*>& getObjectType1(); 
}; 

class C: public B { 
    private: 
    void newFunction(); 
}; 

A* c1 = new C(); 
std::vector<objectType1*> example = c1->getObjectType1(); // Wrong; need dyanmic_cast :-(

は、Aはこの機能について知らない静的な型としてdynamic_castなしgetObjectType1()にアクセスすることはできません表示するには、この例を追加しました。私は私のデザインを再考する必要があります。何か案は?

+0

あなたは継承を意味するためにdifferentを使用しているように見えます。なぜあなたがダウンキャストする必要があるのか​​についての詳細は教えてくれませんでした。どうして? –

+3

仮想関数を使用します。 –

+1

何らかの形で「違い」しなかった場合は、クラスを持つポイントはありませんが、どのような意味がありますか?無関係の追加機能を提供する際に彼らが違っていて、あなたが太ったインターフェースを必要としないということを意味するなら、それは普通ではないが醜いですが、 'dynamic_cast <>'は妥当かもしれません。より簡潔でより良いスコープ付き表記は 'if(C * p = dynamic_cast (a1))...'です。それでも、「クラスBはインターフェイスであることは解決策の一種になります」と私には分かりません。おそらく間違っているように、各クラスにどのような機能を組み込んでいるのか説明する必要があります。 –

答えて

10

適切に設計されたオブジェクト階層では、dynamic_castの使用はかなり珍しいです。確かに、&を多型ツリーにキャストすることはありますが、それを使用する必要はありません。

これについて考えてみましょう。一般的に言って、dynamic_castをなぜ使用する必要がありますか?あなたが持っているベースポインタは必要な機能を提供していないので、そうでしょうか?多形性のポイントは何ですか?同様の操作に対してさまざまな動作を提供するには、動作が実行時に選択される場所ですか?

2つのステートメントは多少矛盾していますか?あなたのオブジェクトのインターフェイスが正しく設計されている場合は、->Foo()に電話するときにどんな種類の動作が採用されるかはまったく気にしません。ちょうど->Foo()に電話してください。

dynamic_castを頻繁に使用する必要がある場合は、インターフェイスに問題があることを示すコードの匂いです。たぶんあなたは1つのインターフェイスにあまりにも多くを押し込もうとしているのでしょうか?

+1

これはまさに私がやったことです!私の質問を編集します。私の正確なデザインボールトを表示する。 – MWright

関連する問題