继承与输入参数无关
Inheritance regardless of input parameters
我想创建接口 class,然后从中继承派生的 class。
不幸的是,可以有多种类型的派生 classes - 具有相同名称但输入参数不同的方法。
这里是继承classes的class图
是否可以创建 InterfaceClass 而不管输入参数的类型(和数量!)?
我想要实现什么 - 拥有多个最终子级 (SpecificWorker1..n),并且每个子级都必须实现名为 "buildRequest" 的方法,但它们是自己的一组输入参数。
谢谢。
不,您对 buildrequest 的所有不同重载都是单独的方法,除了 SpecificWorker3 之外,您的所有 类 都是抽象的,因为它们没有实现没有参数的版本。
你到底想达到什么目的?当您的接口不带参数时,您将如何将参数传递给重载?
你不能按照你想要的方式去做。您可以创建结构的继承层次结构,其中层次结构中的每个子项都包含不同类型的参数。然而,这将完全违背拥有接口和继承的初衷,因为原始接口的每个实现都必须能够处理各种输入。
老实说,你的设计有些可疑,你不应该那样做。你想达到什么目的?
我不知道你为什么要这样做。但是您可以使用可变参数模板尝试此解决方案。只是想回答这个问题:
Is it possible to create InterfaceClass regardless of type (and
count!) of input parameters?
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");
}
输出:
我想创建接口 class,然后从中继承派生的 class。 不幸的是,可以有多种类型的派生 classes - 具有相同名称但输入参数不同的方法。
这里是继承classes的class图
是否可以创建 InterfaceClass 而不管输入参数的类型(和数量!)?
我想要实现什么 - 拥有多个最终子级 (SpecificWorker1..n),并且每个子级都必须实现名为 "buildRequest" 的方法,但它们是自己的一组输入参数。
谢谢。
不,您对 buildrequest 的所有不同重载都是单独的方法,除了 SpecificWorker3 之外,您的所有 类 都是抽象的,因为它们没有实现没有参数的版本。
你到底想达到什么目的?当您的接口不带参数时,您将如何将参数传递给重载?
你不能按照你想要的方式去做。您可以创建结构的继承层次结构,其中层次结构中的每个子项都包含不同类型的参数。然而,这将完全违背拥有接口和继承的初衷,因为原始接口的每个实现都必须能够处理各种输入。
老实说,你的设计有些可疑,你不应该那样做。你想达到什么目的?
我不知道你为什么要这样做。但是您可以使用可变参数模板尝试此解决方案。只是想回答这个问题:
Is it possible to create InterfaceClass regardless of type (and count!) of input parameters?
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");
}
输出: