C++模板方法和获取结果的设计
C++ template method and obtaining result - design
我有这样一个接口类:
class MyInterface
{
public:
virtual void DoStuff() = 0;
virtual Result GetResult() = 0;
};
和简单的抽象方法,实现模板模式:
class Abstract: public MyInterface
{
public:
void DoStuff()
{
DoAFoo();
BakeAPie();
PrepareResult();
}
virtual DoAFoo() = 0;
virtual BakeAPie() = 0;
virtual PrepareResult() = 0;
};
我的问题来了。方法GetResult()应该由Abstract?会有很多这样的子类。
或者应该在抽象类中处理?像这样:
class Abstract: public MyInterface
{
public:
....
GetResult()
{
return m_result;
}
private:
Result m_result;
}
但是,我如何确保Abstract子类将在PrepareResult()中填充m_result?
您应该问自己这样一个问题:"将结果存储在成员中并从GetResult()
返回该成员是GetResult()
的唯一合理实现吗?一些通常可能的替代方案可能是:
-
每次调用
GetResult()
时,按需计算结果。 -
在某个地方缓存多个结果,并根据情况从
GetResult()
返回正确的结果。 -
还有什么。。。?
如果不知道你的确切问题,我们就无法回答,只有你能回答。
如果您得出的结论是,在成员中存储一个结果并返回它是唯一合理的方法,那么您可以继续在Abstract
中实现GetResult()
,因为这样其他所有人都会做完全相同的事情。为了保证PrepareResult()
的正确行为,您可以按如下方式更改界面:
class Abstract: public MyInterface
{
public:
void DoStuff()
{
DoAFoo();
BakeAPie();
m_result = PrepareResult();
}
virtual void DoAFoo() = 0;
virtual void BakeAPie() = 0;
virtual Result PrepareResult() = 0;
virtual Result GetResult()
{ return m_result; }
private:
Result m_result;
};
请注意,我建议您在MyInterface
中将GetResult()
标记为const
(在Abstract
中也是如此)。将其作为const
函数是有意义的。
您应该在MyInterface中实现GetResult,在这个类及其构造函数中添加一个Result属性。
或者您应该删除接口中的这个函数,并在子类中实现它。因为如果接口不包含此属性,则可能意味着该接口知道的内容太多。
相关文章:
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- C++ 获取函数在常量引用中按值返回的结果
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 从 C++ 中的 URL 获取结果
- 如何从主.cpp中的cpp文件中获取功能结果?
- 如何从 regexp_match() 中获取结果
- 无法在 WinRT 中获取异步操作结果 (Windows::Foundation::IAsyncOperating 接口
- C 编程:在循环时运行 2 并从 loop1 获取数据的随机结果
- 如何指定创建文件函数获取未缓存的结果?
- 如何在C++中获取线程的结果
- 如何使用字符串和整数获取汽车类的整数结果
- 获取命令行请求的结果并打开文件
- mysql++(mysqlpp):如何在迭代之前通过UseQueryResult使用fetch_row获取结果中的行数
- 获取两个字符串之间的结果,而不将它们包含在结果中
- 运行CMD命令并将结果获取到字符串变量
- QDialog exec() 并获取结果值
- std::min_element 获取迭代器的结果
- 如何在opencv中从svmPredict()中获取分类结果
- 在 C++ 和 MATLAB 中获取不同的 PGM 像素值结果
- 无法从"g++"调用获取输出结果