目前我正在编写一个C ++程序,它应该包含一个非常通用的基类。哪个会有一些受保护的功能
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:如果有人想知道:最后我选择在子类中定义回调。
答案 0 :(得分:1)
几乎所有东西都是可能的。您可以强制转换为format as json 'auto' timeformat 'YYYY-MM-DD HH:MI:SS';
并返回派生类:
void*
但你为什么要这样做呢?这是一场维护噩梦。其他开发者会看起来像它,并立即想要自杀......或者你......或者更可能两者兼而有之。
你是否正在这样做,以便你可以分享"普通"代码('常见'在吓唬报价中,因为您可以看到它不是常用代码)。在OOP的早期阶段犯下的一个巨大错误就是认为继承,这样做是为了增加重用。这是错的。您可以通过合成来增加重用。
当你最终不得不重新实现多态性来做你正在尝试做的事情时,你可能会想到你可能做的事情并不是你应该做的事情。正在做。
答案 1 :(得分:1)
您是否考虑过使用Command
模式作为回调?
派生类(从Base派生)应使用CommandA和CommandB类来执行所需的行为。
class Command
{
public:
virtual void execute() = 0;
};
class CommandA : public Command
{
public:
CommandA();
void execute() override;
};
class CommandB : public Command
{
public:
CommandB(int param1, double param2);
void execute() override;
};
然后是具体的课程:
class Concrete : public Base
{
public:
Concrete(Command* callA, Command* callB): callbackA(callA), callbackB(callB)
{}
void doA()override
{
...
callbackA->execute();
}
void doB()override
{
...
callbackB->execute();
}
private:
Command* callbackA;
Command* callbackB;
};
答案 2 :(得分:0)
不,那是不可能的。我也没有看到这一点。实现回调的子类必须从包含do函数的实际实现的类派生,所以我不明白为什么带有do实现的类不能声明回调函数。< / p>