Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的私有方法+;接口? 为什么我要定义一个包含私有方法的C++接口?< /p>_C++ - Fatal编程技术网

C+中的私有方法+;接口? 为什么我要定义一个包含私有方法的C++接口?< /p>

C+中的私有方法+;接口? 为什么我要定义一个包含私有方法的C++接口?< /p>,c++,C++,即使在公共范围内的方法在技术上假设与在接口实现时使用私有方法的模板方法类似的情况下,即使如此,我们还是告诉技术规范。就在界面上 这是不是偏离了界面的最初用法(即外部和内部之间的公共契约) 您还可以定义一个friend类,它将使用我们类中的一些私有方法,从而通过接口强制实现。这可能是一个论点 P>在C++中接口定义私有方法的其他参数是什么?,可以声明一个私有的方法,其目的是要被导出。例如: class CharacterDrawer { public: virtual ~Character

即使在公共范围内的方法在技术上假设与在接口实现时使用私有方法的模板方法类似的情况下,即使如此,我们还是告诉技术规范。就在界面上

这是不是偏离了界面的最初用法(即外部和内部之间的公共契约)

您还可以定义一个friend类,它将使用我们类中的一些私有方法,从而通过接口强制实现。这可能是一个论点


<> P>在C++中接口定义私有方法的其他参数是什么?

,可以声明一个私有的方法,其目的是要被导出。例如:

class CharacterDrawer {
public:
   virtual ~CharacterDrawer() = 0;

   // draws the character after calling getPosition(), getAnimation(), etc.
   void  draw(GraphicsContext&);

   // other methods
   void  setLightPosition(const Vector&);

   enum Animation {
      ...
   };

private:
   virtual Vector getPosition() = 0;
   virtual Quaternion getRotation() = 0;
   virtual Animation getAnimation() = 0;
   virtual float getAnimationPercent() = 0;
};
该对象可以为角色提供绘图工具,但必须由提供运动、动画处理等的对象派生

这样做而不是提供“setPosition”、“setAnimation”等的优点是,您不必在每一帧“推”值,而是“拉”它


我认为这可以看作是一个接口,因为这些方法与所有绘图相关内容的实际实现无关。

在模板方法实现中,它可以用于添加专门化约束:不能从派生类调用基类的虚拟方法(否则,该方法将在基类中声明为受保护):


常见的OO观点是,一个接口建立一个单一的契约,定义如何使用符合该接口的对象以及它们的行为。NVI习惯用法或模式(我永远不知道何时一个变成另一个)通过将接口划分为两个单独的契约来改变这种心态:

  • 如何使用接口
  • 派生类必须提供什么

这在某种意义上是C++特有的(事实上对于任何具有多重继承的语言),其中接口实际上可以包含从外部接口适应的代码——用户如何看待我——以及内部接口——我是如何实现的。 这在不同的情况下很有用,首先是当行为很常见,但只能以特定的方式使用通用算法框架进行参数化时。然后,算法可以在基类和派生元素的扩展点中实现。在没有多重继承的语言中,这必须通过拆分为c来实现lass,它在一些参数中实现算法,这些参数符合不同的“private”接口。我在这里使用“private”,因为只有您的类才会使用该接口

第二种常见用法是,通过使用NVI习惯用法,只需在基本级别进行修改,就可以简单地插入代码:

class Base {
public:
   void foo() { 
      foo_impl();
   }
private:
   virtual void foo_impl() = 0;
};
必须编写dispatcher
foo(){foo_impl();}的额外成本
非常小,如果您将代码转换为多线程应用程序,它允许您在以后添加锁定机制,为每个调用添加日志记录,或使用计时器验证每个函数中的实现差异……由于在派生类中实现的实际方法在此级别是私有的,因此可以保证所有多态调用都可以在一个点上进行检测:基(这不会阻止扩展类进行
foo\u impl
public思想)

如果虚拟方法是公共的,那么您无法截获对这些方法的所有调用,并且必须将日志记录和线程安全性添加到实现接口的所有派生类中

为什么我要定义一个C++ 包含私有数据的接口 方法

这个问题有点模棱两可/矛盾:如果你(纯粹)定义了一个接口,那意味着你定义了连接到它的任何东西的公共访问权限。从这个意义上说,你没有定义一个包含私有方法的接口

我认为您的问题来自于将抽象基类与接口混淆(如果我错了,请纠正我)

抽象基类可以是至少有一个抽象成员的部分(甚至完整)功能实现。在这种情况下,拥有私有成员和拥有任何其他类一样有意义


在实践中,很少需要完全没有实现的纯虚拟基类(即只定义纯虚拟函数列表而不定义其他内容的基类)。需要这样做的一种情况是COM/DCOM/XPCOM编程(还有其他情况)。但在大多数情况下,向抽象基类添加一些私有实现是有意义的。

interface!=公共成员。您的接口是您的文档,而不是头文件。
class Base {
public:
   void foo() { 
      foo_impl();
   }
private:
   virtual void foo_impl() = 0;
};
void Base::foo() {
   scoped_log log( "calling foo" ); // we can add traces
   lock l(mutex);                   // thread safety
   foo_impl();
}