3

我有一个设计问题,我不确定如何以最佳方式处理。我希望我的代码是面向未来的,并且仍然不会变得混乱和复杂(极客的困境)。

目前我的设计有以下设置

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

classB与class 不同A,classD与 classE不同,classB与classC不同A

由于这些类不同,我需要使用dynamic_cast运算符。

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

正如你所看到的,我会想要使用dynamic_cast很多!我需要尝试找到一种很好的方法来做到这一点,而不是if()额外的陈述。

有没有一种巧妙的方法来做到这一点?我似乎记得在 Scott Meyers 的书中看到过一些东西,但我离家一两个星期都无法访问它。

任何参考/示例将不胜感激。

另外,如果需要,我可以将类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 :-(

getObjectType1()由于静态类型 A不dynamic_cast知道此功能,因此无法访问。我需要重新考虑我的设计。有任何想法吗?

4

1 回答 1

12

在适当设计的对象层次结构中,使用dynamic_cast是相当罕见的。当然,它可以上下转换多态树,但这并不意味着您必须使用它。

想想这个。dynamic_cast一般来说,为什么需要使用?因为您拥有的基指针不能提供您需要的设施,对吧?多态性的意义何在?为类似的操作提供不同的行为,在运行时选择行为,对吧?

这两种说法是不是有些矛盾?如果您的对象接口设计正确,那么您并不真正关心调用时将采用什么样的行为->Foo()——您只想调用->Foo().

如果您需要频繁使用dynamic_cast,这是一种代码异味,它会告诉您您的接口有问题。也许您正试图在一个界面中投入太多?

于 2012-05-11T11:12:07.280 回答