4

以下类层次结构表示抽象资源处理程序和资源层次结构。两者都将接口作为基类。现在想象你编写一个系统,你可以在这些接口下实现多个特定的资源系统。这里只是一个例子。特定的主类创建从 stuff 派生的资源。现在,当创建的资源被传递给基本接口时,它作为指向基本资源类的指针传递,但我想处理特定资源并访问其特定属性。

我知道双重调度,但我认为它在这种情况下不起作用。我想阻止 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
4

4 回答 4

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,不知道它的确切类型,并将它传递给适当的处理程序。这更棘手...

于 2010-02-28T17:19:33.000 回答
0

我想知道Curiously recurring 模板模式是否是您正在寻找的。stackoverflow上已经有一个关于这个主题的线程

于 2010-02-28T16:59:32.220 回答
0

我想你可能正在寻找这个:

http://www.artima.com/cppsource/cooperative_visitor.html

于 2010-04-13T16:36:42.673 回答
0

我不确定为什么你需要资源和处理程序 - 似乎你暴露了一个额外的耦合到某些东西会被封装。如果 create resource 只是返回了客户端可以直接调用方法的资源,则问题不会存在。

如果您想要安全,请让资源记住创建它的处理程序的地址,然后将其签入do_some(resource* st). 如果资源是由当前处理程序创建的,并且处理程序只能创建给定类型的资源,则可以安全地转换它并调用特定函数。尽管如上所述,如果该函数只是资源上的一个虚函数,则根据定义,它是类型安全的。

于 2010-02-28T17:18:34.397 回答