听起来您使用OOP的方式不正确。
由于QEExec
是 IExecutor
(继承),因此initialize
可以像IExecutor
一样,两者都可以initialize的行为与其IParams
对象类似。如果是这样,那么应该对a
,b
和c
采取行动的人应该是QEParams
,而不是QEExec
。
您可以使用以下多态性来做到这一点:
class IParams {
virtual void init_logic() { }
};
class QEParams : public IParams {
public:
void init_logic() { /* Do something with a/b/c */ }
private:
int a;
int b;
int c;
};
然后...
class IExecutor {
IParams params;
public:
virtual void initialize(IParams *iParams);
virtual void execute();
};
class QEExec : public IExecutor {
public:
//Will call the QEParams init_logic when passed a QEParams pointer
void initialize(IParams *iParams) { iParams->init_logic(); }
void execute() override;
};
,
- 接口没有任何字段
- 接口只有纯虚拟方法
-
initialize
中的名称IExecutor
表示一些误解。看起来好像在构造期间的乞讨中被调用过一次。应该将其隐藏在某些工厂创建实现IExecutor
的对象的步骤中
所以基本上我怀疑您需要更多类似的东西:
class IExecutor
{
public:
virutal ~IExecutor() {}
virtual void execute() = 0;
};
struct QEParams {
int a;
int b;
int c;
};
class QEExec: public IExecutor
{
public:
QEExec(int b,int c) ....
void initialie(); // second step init
void execute() override;
};
class CAExec: public SomeOtherBaseClass,public IExecutor
{
public:
CAExec(int a,int c) ....
void execute() override;
};
std::unique_ptr<IExecutor> executorFactory(const QEParams& params)
{
if (params.a < 0) {
auto result = std::make_unique<QEExec>(params.b,params.c);
result->initialie();
return result;
}
return std::make_unique<CAExec>(params.a,params.c);
}
通常,工厂参数是结构数据,过时的抽象已过时。
如果需要不同类型的参数来创建IExecutor
的替代版本,则只需提供不同的工厂函数(可能是重载):
std::unique_ptr<IExecutor> executorFactory(const std::string& fileName)
{
....
}
本文链接:https://www.f2er.com/3049694.html