C++ C++;模板法与结果获取——设计
我有这样一个接口类:C++ C++;模板法与结果获取——设计,c++,design-patterns,C++,Design Patterns,我有这样一个接口类: class MyInterface { public: virtual void DoStuff() = 0; virtual Result GetResult() = 0; }; 简单的抽象方法,实现模板模式: class Abstract: public MyInterface { public: void DoStuff() { DoAFoo(); BakeAPie(); PrepareRe
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;
}
但是,我如何确保抽象子类将在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属性
或者您应该在接口中删除此函数并在子类中实现它。因为如果接口不包含此属性,则可能意味着接口知道的太多。为什么要
抽象
实现MyInterface
的任何方法,以避免重复完全相同的DoStuff()实现在许多具体的实现中,我还希望避免重复GetResult(),但我不确定这是否是一个好的做法。Abstract
和MyInterface
之间的关系是什么?但是MyInterface
和Abstract
之间似乎没有联系。谢谢。我忘了继承;)。另一方面,int也有价值eFace类只有内联和纯虚函数(没有数据)。在我看来,接口应该是…一个接口。没有任何属性。