3

最善の方法で処理する方法がわからないという設計上の問題があります。私は自分のコードが将来の証明であることを望んでいます。

現在、私のデザインには次の設定があります

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

クラスBはクラスと異なりA、クラスDとクラスはクラスと異なりE、クラスとは異なります。BCA

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

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

dynamic_cast見ての通り、たくさん使いたくなる!if()余分なステートメントでいっぱいではない、これを行うための良い方法を見つけようとする必要があります。

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

参考文献/例は大歓迎です。

また、必要に応じてB、一種のソリューションとなるクラスをインターフェイスにすることもできます

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

しかし、理想的ではありません。

注: この例を追加して、現在の設計の失敗を示しました。

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 はこの関数を知らないため、getObjectType1()アクセスすることはできません。dynamic_cast設計を再考する必要があります。何か案は?

4

1 に答える 1

12

適切に設計されたオブジェクト階層では、 を使用することはdynamic_castほとんどありません。確かに、多相ツリーを上下にキャストするために存在しますが、それを使用する必要があるという意味ではありません。

これについて考えます。dynamic_cast一般的に言えば、なぜ を使用する必要があるのでしょうか? あなたが持っているベースポインターは、必要な機能を提供していないからですよね? そして、ポリモーフィズムのポイントは何ですか?同様の操作に異なる動作を提供するには、実行時に動作が選択されますよね?

この 2 つのステートメントは、やや矛盾していませんか? オブジェクトのインターフェースが正しく設計されていれば、呼び出すときにどのような動作が行われるかはあまり気にしなくて済みます。->Foo()単に を呼び出したいだけです->Foo()

を頻繁に使用する必要がある場合dynamic_cast、それはインターフェースに問題があることを示すコードの匂いです。1 つのインターフェイスに多くの情報を詰め込みすぎているのではないでしょうか?

于 2012-05-11T11:12:07.280 に答える