在接口中使用const是否有意义?

Pat*_*ick 12 c++ const interface

我有一个模块执行一些计算,在计算过程中,与其他模块通信.由于计算模块不想依赖其他模块,因此它会公开这样的接口(当然这是一个非常简化的版本):

class ICalculationManager
   {
   public:
      double getValue (size_t index) = 0;
      void setValue (size_t index, double value) = 0;
      void notify (const char *message) = 0;
   };
Run Code Online (Sandbox Code Playgroud)

想要使用计算模块的应用程序需要编写自己的接口实现,并将其提供给计算工具,如下所示:

MyCalculationManager calcMgr;
CalculationTool calcTool (calcMgr);
calcTool.calculate();
Run Code Online (Sandbox Code Playgroud)

我现在想知道将"const"添加到ICalculationManager接口的方法是否有意义.

似乎合乎逻辑的是,getValue方法只能得到一些东西并且不会改变任何东西,所以我可以制作这个const.并且setValue可能会更改数据,因此不会是const.但是对于像通知这样更通用的方法,我无法确定.

事实上,对于所有方法,我现在可以确定该方法实际上是作为const方法实现的,如果我将接口方法设为const,我强制所有实现也是const,这可能不是通缉.

在我看来,如果你事先知道你的实现是什么以及它是否是常量,那么const方法才有意义.这是真的?

制作这种接口const的方法是否有意义?如果它有意义,那么确定方法是否应该是const的好规则是什么,即使我不知道实现是什么?

编辑:将参数从通知从"char*"更改为"const char*",因为这会导致无关的答案.

Edw*_*nge 5

const当您向客户广告时,您可以创建一个函数,调用该函数永远不会更改对象的外部可见状态.您的对象只有一个可以检索的状态getValue.

因此,如果getValue可以导致下一个getValue返回不同​​的值,那么请确保将其保持为非const.如果你想告诉客户端调用getValue()永远不会改变下一个getValue()返回的值,那么将它设为const.

通知相同:

double d1 = mgr->getValue(i);
mgr->notify("SNTH");  // I'm cheating.
double d2 = mgr->getValue(i);
assert(d1==d2);
Run Code Online (Sandbox Code Playgroud)

如果对于所有情况都应该成立,那么我所有的则notify()应该是const.否则不应该.

  • 接口在概念上不仅决定技术性(参数/返回值),还决定方法的*含义*.接口可以说"调用getTime()必须返回UTC时间".如果实现返回本地时间,则它实现错误.同样,如果接口说"getValue()不能改变对象的外部可见状态",那么将其设为const.如果界面说"实现可以改变它",那么使它成为非const.简而言之:界面决定,实现必须遵循它.接口应该是明确的. (3认同)