MWr*_*ght 2 c++ oop polymorphism downcast
我有一个设计问题,我不知道如何以最好的方式处理.我希望我的代码能够成为未来的证明,而且仍然不会变得混乱和复杂(极客的困境).
目前我的设计有以下设置
derived class D derived class E
^ ^
| |
derived abstract class B -> derived class C
^ ^
| |
Abstract Base class A
Run Code Online (Sandbox Code Playgroud)
类B从类不同A,类D和类E从类不同B和C从类不同A.
由于这些类不同,我需要使用dynamic_cast运算符.
A* a1 = new class C;
C* c1 = dynamics_cast<C*>(a1);
if(c1){ //Success!!!}
...
Run Code Online (Sandbox Code Playgroud)
如你所见,我会想要使用dynamic_cast很多!我需要尝试找到一种很好的方法来做到这一点,而不是if()额外的语句.
这样做有一个简洁的方法吗?我似乎记得在Scott Meyers的书中看到了一些东西,但是我不在家,一两个星期都无法访问它.
任何参考/示例将非常感激.
此外,如果需要,我可以将类B变成一个接口,这将是一种解决方案
B* d1 = new D;
B* e1 = new E;
Run Code Online (Sandbox Code Playgroud)
但并不理想.
注意:我已添加此示例以显示我当前的设计失败
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 :-(
Run Code Online (Sandbox Code Playgroud)
无法访问getObjectType1(),dynamic_cast因为静态类型A不知道此功能.我需要重新考虑我的设计.有任何想法吗?
Joh*_*ing 11
在一个设计合理的对象层次结构中,使用dynamic_cast是很少见的.当然,存在抛出多态树,但这并不意味着你必须使用它.
想想这个.dynamic_cast一般来说,为什么你需要使用?因为您拥有的基准指针不能提供您需要的设施,对吧?多态性有什么意义?为类似操作提供不同的行为,在运行时选择行为,对吧?
那两个陈述有点矛盾吗?如果您的对象的界面设计正确,那么您并不关心在打电话时会采用什么样的行为->Foo()- 您只是想打电话->Foo().
如果你需要频繁使用dynamic_cast,它的代码味道会告诉你接口有问题.也许你试图在一个界面上推得太多?
| 归档时间: |
|
| 查看次数: |
2445 次 |
| 最近记录: |