定义自引用接口的正确方法是什么?

时间:2017-01-01 22:00:52

标签: c++ interface self-reference

我很抱歉,如果之前已经提出这个问题,我会努力寻找类似的东西,但我甚至不确定要搜索什么。

假设我有以下界面(这只是一个例子,我的具体情况与运营商或添加无关):

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);
  }
}

但是我对我的解决方案并不完全满意,因为我仍然需要定义至少一个操作,但是代码没有明确强制执行,忘记定义一个导致非常不合理的错误消息"堆栈溢出"。我可以在第一个示例中保留接口,以确保实现它的每个类都定义了所需的方法,但这反过来会在非常规的情况下导致大量冗余代码。

是否有正确的方法在这种情况下减少代码冗余,同时仍然保持编译时检查并选择向接口用户实施哪些方法?

PS:我知道我可以将这些方法中的一种纯粹虚拟但是我不能选择在可以实现加法而不是减法的情况下我可以定义哪种方法(TBH只是一种小挑剔,但我仍然想知道是否有更好的方法。)

1 个答案:

答案 0 :(得分:1)

最好保持您的界面纯粹抽象。如果要根据operator +()实现operator-(),反之亦然,请在实现类中执行。

如果由于某种原因你真的想最小化你的实现类必须覆盖的方法的数量,考虑创建一个辅助类,它继承你的接口并根据其他方法实现一些方法。您可以将这些方法标记为 final (C ++ 11特性),以禁止它们被您的实现类重新覆盖,该实现类将对辅助类进行子类化。