2010-02-28 56 views
4

以下类层次结构表示抽象资源处理程序和资源层次结构。两者都有作为基类的接口。现在想象你编写一个系统,你可以在这些接口下实现多个特定的资源系统。这只是一个例子。特定的主类创建从东西派生的资源。现在,当创建的资源交给基本接口时,它将作为指向基本资源类的指针递交,但我想处理特定资源并访问其特定属性。C++使用镜像层次结构进行双重调度

我知道双重派遣,但我不认为它在这种情况下工作。我想阻止RTTI和dynamic_casts。你有处理这种情况的建议吗?

class resource; 

class main_resource_handler 
{ 
public: 
    virtual resource* create_resource() = 0; 
    virtual void do_some(resource* st) = 0; 
}; 

class resource 
{ 
}; 

class specific_resource : public resource 
{ 
public: 
    int i; 
}; 

class specific_resource_handler : public main_resource_handler 
{ 
public: 
    stuff* create_resource) { 
     return new specific_resource); 
    } 
    void do_some(resource* st) { 
     // in here i want to work with specific resource 
    } 
    void do_some(specific_resource* st) { 
     // i want to get here 
    } 
} 

main_resource_handler* handler = new specific_resource_handler(); 
resource* res = handler->create_resource(); 
handler->do_some(res); /// here 
+1

有在回答这个问题的一些想法:http://stackoverflow.com/questions/696350/avoiding -parallel继承的层次结构 – quamrana 2010-02-28 18:52:03

回答

0

我不知道为什么你需要资源和处理程序 - 看起来你正在暴露一个额外的耦合,将被封装。如果创建资源刚刚返回客户端可直接调用方法的资源,则问题不存在。

如果您想要安全,请让资源记住创建它的处理程序的地址,然后检查do_some(resource* st)。如果资源是由当前处理程序创建的,并且处理程序只能创建给定类型的资源,则可以安全地转换它并调用特定的函数。尽管如上所述,如果函数只是资源上的虚拟函数,那么按照定义类型安全。

1

我想你不是问正确的问题。

要做到你的要求,你需要的是要补充一点:

template<typename T> 
class helper : public main_resource_handler 
{ 
public: 
    virtual resource* create_resource() { return new T; } 
    virtual void do_some(resource* st) { do_some_specific(static_cast<T*>(st)); } 
private: 
    virtual void do_some_specific(T* st) = 0; 
}; 

并改变这一点:

class specific_resource_handler : public helper<specific_resource> 
{ 
private: 
    virtual void do_some_specific(T* st) { ... } 
} 

static_cast是唯一安全的,如果你能保证你会总是在正确类型的处理程序上调用do_some。但是,如果您已经知道这是正确的处理程序,那么就不需要进行基类的方法调用。所以大概你想要得到某种resource,不知道它的确切类型,并将其传递给适当的处理程序。这是棘手......