C++模板方法和获取结果的设计

C++ template method and obtaining result - design

本文关键字:结果 获取 模板方法 C++      更新时间:2023-10-16

我有这样一个接口类:

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属性。

或者您应该删除接口中的这个函数,并在子类中实现它。因为如果接口不包含此属性,则可能意味着该接口知道的内容太多。