我可以强制定义具有接口 class 的特定构造函数吗?
Can I enforce defining a specific constructor with an interface class?
我想创建一个接口 - 一个抽象 class,其中强制派生的 classes(即符合接口)提供特定的构造函数。
大致情况:
class IComClient
{
public:
virtual IComClient(int _id, TBaseCom*_com) = 0;
virtual void task() = 0;
private:
int id;
TBaseCom* com;
);
显然,这行不通 - 因为我 read, a class can't have a pure virtual constructor - or 通常是一个虚拟构造函数。我不关心以多态方式创建派生 classes 的实例,我只是希望编译器在派生 class 不提供采用这些特定输入参数的构造函数时提出抗议。
C# 有答案,但 C++ 中的情况是否相同?
无法为基 class 中的派生 classes 强制存在特定的构造函数 class。
您可以通过尝试调用该构造函数或使用 static_assert
.
来强制特定构造函数的存在
类似的东西可能不是通过基础 class 实现的,而是使用元 class... 如果 they 在未来的标准中被接受到语言中。
存在接口以便旧代码可以调用新代码。您编写了一个提供函数的接口,比如 foo()
。我可以编写调用 foo()
now 的代码,即使尚未实现 foo()
。它将能够调用 foo()
的任何未来实现,这些实现是在我退休到我在巴哈马群岛的别墅很久之后写的。
如果您宣称您 class 的所有未来后代都将实现默认构造函数,那么此信息对我来说毫无用处。我无法构建尚未编写的 class 的实例!我或其他没有见过您的 class 后代的人应该如何处理您的公告?
如果有用户 A 想要创建您的 class 的后代,而用户 B 想要实例化 A 的 class,那么让他们自己决定如何做到最好。你不是他们交易的一方。
但是等一下,我 可以 有点构造尚未编写的 class 的实例!我需要写一个模板,在里面构造一个对象,有人会用他们的 class 实例化它。但是这样我就可以使用默认构造函数,这种使用会强制任何想要实例化我的模板的人实现默认构造函数。
当然你不能强迫任何人实例化你的模板。如果用户需要,他们将实现您需要的构造函数。如果他们不需要你的服务,你最好不要告诉他们该怎么做。
我想创建一个接口 - 一个抽象 class,其中强制派生的 classes(即符合接口)提供特定的构造函数。
大致情况:
class IComClient
{
public:
virtual IComClient(int _id, TBaseCom*_com) = 0;
virtual void task() = 0;
private:
int id;
TBaseCom* com;
);
显然,这行不通 - 因为我 read, a class can't have a pure virtual constructor - or 通常是一个虚拟构造函数。我不关心以多态方式创建派生 classes 的实例,我只是希望编译器在派生 class 不提供采用这些特定输入参数的构造函数时提出抗议。
C# 有答案,但 C++ 中的情况是否相同?
无法为基 class 中的派生 classes 强制存在特定的构造函数 class。
您可以通过尝试调用该构造函数或使用 static_assert
.
类似的东西可能不是通过基础 class 实现的,而是使用元 class... 如果 they 在未来的标准中被接受到语言中。
存在接口以便旧代码可以调用新代码。您编写了一个提供函数的接口,比如 foo()
。我可以编写调用 foo()
now 的代码,即使尚未实现 foo()
。它将能够调用 foo()
的任何未来实现,这些实现是在我退休到我在巴哈马群岛的别墅很久之后写的。
如果您宣称您 class 的所有未来后代都将实现默认构造函数,那么此信息对我来说毫无用处。我无法构建尚未编写的 class 的实例!我或其他没有见过您的 class 后代的人应该如何处理您的公告?
如果有用户 A 想要创建您的 class 的后代,而用户 B 想要实例化 A 的 class,那么让他们自己决定如何做到最好。你不是他们交易的一方。
但是等一下,我 可以 有点构造尚未编写的 class 的实例!我需要写一个模板,在里面构造一个对象,有人会用他们的 class 实例化它。但是这样我就可以使用默认构造函数,这种使用会强制任何想要实例化我的模板的人实现默认构造函数。
当然你不能强迫任何人实例化你的模板。如果用户需要,他们将实现您需要的构造函数。如果他们不需要你的服务,你最好不要告诉他们该怎么做。