目前我正在编写一个 C++ 程序,它应该包含一个非常通用的基类。其中会有一些 protected 功能
class Base{
virtual void doA() = 0;
virtual void doB() = 0;
\\[see below]...
}
它们将异步执行,并在它们完成后立即调用它们作为回调:
virtual void doACallback(type1 param1, type2 param2) = 0;
virtual void doBCallback() = 0;
我的问题是 doA
和 doB
的实现对于每个子类都是不同的,回调方法应该能够接收不同的参数(类型和数字) .是否可以在基类中保留回调方法声明的同时进行管理?也许这可以通过另一种方式来实现。我还是 C++ 的新手。
注意:Base 不仅仅包含纯虚函数。
编辑:因为有人问。我想定义子类的一般“外观”。我的具体场景非常复杂,但让我们尝试一个例子:
class Base{
virtual void sendData() = 0;
virtual void sendDataCallback() = 0;
}
class SubclassA:public Base{
void sendData() override{
//send Data by using LibraryA
}
void sendDataCallback(ErrorCode aErrorCode) override{
//handle error Code
}
}
class SubclassB:public Base{
void sendData() override{
//send Data by using LibraryB
}
void sendDataCallback(ErrorCode aErrorCode, Response aResponse) override{
//handle error Code and handle response
}
}
这不是确切的场景,但也许这澄清了这个想法......
编辑 2:如果有人想知道:最后我选择在子类中定义回调。
最佳答案
几乎任何事情都是可能的。您可以转换为 void*
并返回派生类:
struct ScrewThis
{
void addCallback(void * cb) { callbacks.push_back(cb); }
void executeCallback(int index) const = 0;
std::vector<void*> callbacks;
};
struct TotalHell : ScrewThis
{
void executeCallback(int index) const
{
auto callback
= static_cast<std::function<int(int,int)> const*>(callbacks[index]);
auto i = callback(4,2);
//...
}
};
但是你到底为什么要这么做?这是维护的噩梦。其他开发者会看到它并立即想自杀……或者你……或者更可能是两者。
您这样做只是为了共享“通用”代码(“通用”用引号引起来,因为如您所见,它不是通用代码)。 OOP 早期犯下的一个巨大错误是认为继承是为了增加重用。这是错误的。您可以通过组合增加重用。
当你最终不得不重新实现多态性来做你想做的事情时,是时候想想也许你想做的不是你应该做的。
关于C++:在基类中使用带有泛型虚函数的异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270783/