繁体   English   中英

继承与输入参数无关

[英]Inheritance regardless of input parameters

我想创建接口类,然后从中继承派生类。 不幸的是,可以有多种类型的派生类-名称相同但输入参数不同的方法。

这是继承的类的类图 在此处输入图片说明

是否可以创建InterfaceClass,而与输入参数的类型(和计数!)无关?

我要实现的目标-拥有多个最终子级(SpecificWorker1..n),每个子级都必须实现名称为“ buildRequest”的方法,但是它自己是一组自己的输入参数。

谢谢。

不,您对buildrequest的所有不同重载都是单独的方法,除了SpecificWorker3以外,您的所有类都是抽象的,因为它们没有实现没有参数的版本。

您实际上想达到什么目的? 当接口不带参数时,如何将参数传递给重载?

我不知道您为什么要这样做。 但是您可以使用可变参数模板尝试此解决方案。 只是想回答这个问题:

是否可以创建InterfaceClass,而与输入参数的类型(和计数!)无关?

template <typename Head, typename ...Tail>
class InterfaceClass
{
private:
    static void buildRequest() {};

public:
    virtual ~InterfaceClass() = default;
    virtual void buildRequest(Head h, Tail  ...t) = 0;
};

template <typename Head, typename ...Tail>
class DefaultWorker : public InterfaceClass <Head, Tail...>
{
public:

    virtual void buildRequest(Head h, Tail  ...t) = 0;

};

class SpecificWorker1 : public DefaultWorker <std::list<int>, int>
{
public:

    void buildRequest(std::list<int> h, int g = 0) override
    {
        std::cout << "Hello from SpecificWorker1. list size: " << h.size() << std::endl;
    }

};

class SpecificWorker2 : public DefaultWorker <int, float>
{
public:
    void buildRequest(int h, float f) override
    {
        std::cout << "Hello from SpecificWorker2. " << h << " " << f << std::endl;
    }
};

class SpecificWorker3 : public DefaultWorker <int, float, std::string>
{
public:
    void buildRequest(int h, float f, std::string comment) override
    {
        std::cout << "Hello from SpecificWorker3. int: " << h << " float:  " << f << " comment: " << comment << std::endl;
    }
};

int main()
{
    SpecificWorker2 e;
    e.buildRequest(1, 1.1);

    std::list<int> list{ 1, 2, 3 };
    SpecificWorker1 c;
    c.buildRequest(list);

    SpecificWorker3 d;
    d.buildRequest(1, 1.1, "this is a comment");

    system("pause");

}

输出:

在此处输入图片说明

您无法按照自己的方式去做。 您可以创建结构的继承层次结构,其中层次结构中的每个子级都包装不同种类的参数。 但是,这将完全破坏首先具有接口和继承的目的,因为原始接口的每个实现都必须能够处理各种输入。

老实说,您的设计有些复杂,您不必这样做。 您想达到什么目的?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM