1

我有这样一个接口类:

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 的每个具体实现来实现?会有很多这样的子类。

还是应该在 Abstract 类中处理?像这样:

class Abstract: public MyInterface
{
  public:
    ....
    GetResult()
    {
      return m_result;
    }

  private:
    Result m_result;
}

但是我如何确保 Abstract 子类将在 PrepareResult() 中填充 m_result?

4

2 回答 2

3

您应该问自己这个问题:“是否将结果存储在成员中并从GetResult()唯一合理的实现中返回该成员GetResult()?一些通常可能的替代方案可能是:

  • 每次GetResult()调用时按需计算结果。

  • 在某处缓存多个结果并GetResult()根据情况返回正确的结果。

  • 还有什么……?

在不知道您的确切问题的情况下,我们无法回答这个问题,只有您可以。

如果您得出的结论是,将单个结果存储在成员中并返回它是唯一合理的方法,您可以继续执行GetResult()in Abstract,因为无论如何其他人都会做同样的事情。为了保证 的正确行为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;
};

请注意,我建议您标记GetResult()constin MyInterface(以及 so in Abstract)。const将其作为一个函数是有意义的。

于 2013-07-29T07:48:39.090 回答
0

您应该在 MyInterface 中实现 GetResult,在此类及其构造函数中添加 Result 属性。

或者你应该在接口中删除这个函数并在子类中实现它。因为如果接口不持有这个属性,可能意味着接口知道的太多了。

于 2013-07-29T07:50:38.570 回答