定义自我引用界面的正确方法是什么?



很抱歉,如果以前问这个问题,我努力找到类似的东西,但是我什至不确定要搜索什么。

假设我有以下接口(这只是一个示例,我的特定情况与操作员或添加无关):

class AddAndSub
{
public:
  virtual AddAndSub operator +(AddAndSub const &) = 0;
  virtual AddAndSub operator -(AddAndSub const &) = 0;
}

由于a + b可以用a - (-b)a - b表示为a + (-b)(为简单起见,假设对所有派生类型都很好地定义了否定)我的第一个本能是在实现中模拟此属性,因此只有一个操作员需要明确地进行明确的操作员定义:

class AddAndSub
{
public:
  virtual AddAndSub operator +(AddAndSub const & b)
  {
    return *self - (-b);
  }
  virtual AddAndSub operator -(AddAndSub const & b)
  {
    return *self + (-b);
  }
}

但是,我对我的解决方案并不完全满意,因为我仍然需要定义至少一个操作,但是该代码并未明确执行,而忘记在非常不描述性错误消息中定义一个结果" stack"溢出"。在第一个示例中,我可以离开界面,以确保实现它的每个类都定义了所需的方法,但是在非客气情况下,这又导致了许多冗余代码。

是否有适当的方法可以在这种情况下减少代码冗余,同时仍保持编译时间检查并留下哪些方法可以实现到接口用户?

ps:我知道我只能制作其中一种纯虚拟的方法之一,但是我不能选择可以定义哪种方法在某种情况下更难实现添加的方法(哪个TBH只是一个次要的nitpick,但我仍然想知道是否有更好的方法)。

最好将接口保持纯抽象。如果您想以操作员 ()或反之亦然实现操作员 - (),请在您的实施类中执行此操作。

出于某种原因,您确实想最大程度地减少实现类必须覆盖的方法数量的数量,请考虑创建一个辅助类,该类别分类您的接口,并根据其他方法实现某些方法。您可以将这些方法标记为 final (a C 11功能),以禁止它们再次被您的实现类覆盖,这将是对手助手的分类。

相关内容

最新更新