gpt4 book ai didi

c++ - 你如何抽象接口(interface)类

转载 作者:行者123 更新时间:2023-11-28 01:17:10 25 4
gpt4 key购买 nike

我最近正在尝试使用我自己的小框架(实际上只是为了兴趣:))。我想抽象一个接口(interface)来描述具有输入和输出的过程。所以我定义了一个类BaseInput和一个类Baseoutput。这是界面。

class IProcess
{
public:
virtual void Proc(BaseInput &input) = 0;
};

这是我的问题。 IProcess 派生的类必须根据 C++ 标准将 BaseInput 作为其参数类型。我希望子类可以是这样的(我知道这是错误的):

class ProcessA : public IProcess
{
public:
void Proc(MyInput &input) override;
};

我知道这无法正确编译。我也知道它可以转换为 ProcessA::Proc 中的 MyInput 指针。我考虑过依赖注入(inject),但我不知道它是否能解决我的问题。

你们在实际项目中是如何解决这类问题的?

附言其实我也发现了类似的情况here

编辑 1:好吧,我为我的错误表达感到非常抱歉。并感谢你们所有人的帮助。 MyInput 实际上带来了一些这样的数据:

class MyInput : public BaseInput
{
public:
//... some functions
std::vector<int> m_Data;
};

也就是如果我需要从 proc 访问 m_Data 而无需任何指针转换,参数的类型应该是 MyInput&。我想要实现的是像 .NET Core MVC 一样的架构。输入工作类接受不同的输入(来自文件、互联网或串行端口...),将它们打包到从 BaseInput 派生的类中,并将其提供给从 IProcess 派生的一些进程类> (也许还有一些中间件),最后返回一个由派生自 BaseOutput 的输出类打包的结果。

这可能是一个非常愚蠢的架构。我也想知道如何让它变得更好。我也考虑过不打包这些输入。但我不知道如何:-x

再次感谢大家🙏

最佳答案

实际上,MyInput必须继承BaseInput。然后,ProcessA::Proc 必须与它应该覆盖的 IProcess::proc 具有相同的原型(prototype)(因此它必须采用 BaseInput 也作为参数)。

通过使用多态性,您将能够在调用函数时传递一个MyInput,因为您传递了一个引用并且MyInput 继承了BaseInput.


这是一个例子:

.h:

class BaseInput
{
public:
virtual ~BaseInput();
virtual void display();
};
class MyInput : public BaseInput
{
public:
void display() override;
};

class IProcess
{
public:
virtual ~IProcess();
virtual void proc(BaseInput & input) = 0;
};
class ProcessA : public IProcess
{
public:
void proc(BaseInput & input) override;
};

.cpp:

BaseInput::~BaseInput()
{}
void BaseInput::display()
{
std::cout << "BaseInput::display()" << std::endl;
}
void MyInput::display()
{
std::cout << "MyInput::display()" << std::endl;
}

IProcess::~IProcess()
{}

void ProcessA::proc(BaseInput & input)
{
input.display();
}

主要:

int main()
{
MyInput mi;
ProcessA pa;

pa.proc(mi); // Pass a MyInput

return 0;
}

输出是(如预期的那样):

MyInput::display()


编辑(对问题编辑 1 的回答):

你有两个解决方案。

要么在 BaseInput 中定义每个输入类型需要实现的方法(就像我对 display() 所做的那样)。例如,在您的情况下,它可能是一个 getData() 成员。

或者您必须将给定的 BaseInput & dynamic_cast 转换为 MyInput &
请记住,如果 dynamic_cast 因指针而失败,它会返回一个 nullptr,但如果它因引用而失败,它将抛出一个 std::bad_cast 异常。
当您使用引用时,您将必须捕获异常以防潜在的失败(如果给出了另一种类型的输入)。

关于c++ - 你如何抽象接口(interface)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58317528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com