C++从具有嵌套类的接口(interface)派生

标签 c++ inheritance interface

我正在编写代码来处理“Foo”类型的对象。 foo 是一种容器,为了提供对其元素的高效和抽象访问,它提供了 Element 类型的嵌套类。 Element 包装对象在容器中的位置。

现在,“Foo”可能有不同的实现,所以我正在编写一个抽象基类 FooInterface 来为它们提供一个通用接口(interface)。问题是每个实现可能需要定义自己的 Element 类型。例如,一个实现可能将其数据保存在一个 vector 中,这样它的 Element 包装一个 vector 迭代器,而另一个实现包含一个列表,并且它的 Element 包装一个列表迭代器。

我已经制定了一个使用 void 指针的解决方案。本质上,基类定义了一个包装了 void 指针的 Element 类。 FooInterface 的不同实现可以将 void 指针转换为它们用来表示元素的任何类型。暂时忽略内存泄漏:

class FooInterface
{
    public:
    class Element {
        void* payload;
        public:
        Element(void* payload) : payload(payload) {}
        void* getPayload() const { return payload; } 
    };

    virtual void say_element(Element) = 0;
    virtual Element getElement() = 0;
};


class FooOne : public FooInterface
{
    public:
    virtual void say_element(Element element)
    {
        std::cout << "FooOne says: " << 
            * (int *) element.getPayload() << "." << std::endl;
    }

    virtual Element getElement()
    {
        return Element(new int(42));
    }
};


class FooTwo : public FooInterface
{
    public:
    virtual void say_element(Element element)
    {
        std::cout << "FooTwo says: " << 
            * (std::string*) element.getPayload() << "." << std::endl;
    }

    virtual Element getElement()
    {
        return Element(new std::string("This is a test"));
    }
};


void say(FooInterface& foo)
{
    FooInterface::Element el = foo.getElement();
    foo.say_element(el);
}


int main()
{

    FooOne foo_one;
    FooTwo foo_two;

    say(foo_one);
    say(foo_two);

    return 0;
}

虽然这可行,但似乎必须有更好的方法。我的理解是,如果可能的话,应该避免使用 void 指针。那么,这是实现这一目标的最佳方式吗?

编辑:

诚然,我在描述我在这篇文章中想要做的事情方面做得很差。尽管如此,答案还是有助于让我思考,我已经设计出我认为不错的解决方案 here .

最佳答案

您可以使 FooInterface 成为模板并传递任何 Element 应该存储的模板参数:

template <typename Payload>
class FooInterface
{
    public:
    class Element {
        Payload payload;
        public:
        Element(Payload payload) : payload(payload) {}
        Payload getPayload() const { return payload; } 
    };

    virtual void say_element(Element) = 0;
    virtual Element getElement() = 0;
};

然后您的子类必须将适当的模板参数传递给父类(super class):

class FooOne : public FooInterface<int>
{
    public:
    virtual void say_element(Element element)
    {
        std::cout << "FooOne says: " << 
            element.getPayload() << "." << std::endl;
    }

    virtual Element getElement()
    {
        return Element(42);
    }
};

关于C++从具有嵌套类的接口(interface)派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611466/

相关文章:

c# - 如何创建具有继承性的泛型类?

java - 如何访问 list< 的实际运行时对象上的方法?扩展基类>?

java - 这个自定义接口(interface)实现线程安全吗

java - 在 Java 的同一个接口(interface)中实现多个类?

c++ - 为什么理想带通滤波器不能按预期工作?

c++ - 读取文本文件时出错

c++ - 查找所有在 Boost 中排序的

c++ - 具有重载的显式模板函数特化 : Why would you do it?

c# - 如何对子类隐藏父属性

delphi - Delphi 7 和 Delphi 2007 中接口(interface)的区别