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类只有内联和纯虚函数(没有数据)。在我看来,接口应该是…一个接口。没有任何属性。