为什么我要定义包含私有方法的C++接口?
即使在公共范围中的方法在技术上会假设像在接口实现上使用私有方法的模板方法那样的情况下,即便如此,我们也会告诉技术规范.就在界面上.
这不是偏离接口的原始用法,即外部和内部之间的公共合同吗?
您还可以定义一个友元类,它将使用我们类中的一些私有方法,因此强制通过接口实现.这可能是一个争论.
在C++中用于在接口中定义私有方法还有哪些其他参数?
常见的OO视图是接口建立单个合同,该合同定义如何使用符合该接口的对象以及它们的行为方式.NVI习语或模式,我永远不知道何时成为另一个,通过将接口划分为两个单独的合同来提出改变这种心态:
这在某种意义上是特别适用于C++(事实上对于任何具有多重继承的语言),其中接口实际上可以包含适应外部接口的代码 - 用户如何看待我 - 以及内部接口 - 我是实现.
这在不同情况下非常有用,首先是行为很常见但可以使用通用算法框架以特定方式进行参数化.然后,算法可以在基类中实现,扩展点可以在派生元素中实现.在没有多重继承的语言中,这必须通过拆分为一个类来实现,该类基于一些符合不同"私有"接口的参数来实现算法.我在这里使用'private'只是你的类将使用该接口.
第二种常见用法是,通过使用NVI惯用法,只需在基本级别进行修改即可轻松检测代码:
class Base {
public:
void foo() {
foo_impl();
}
private:
virtual void foo_impl() = 0;
};
Run Code Online (Sandbox Code Playgroud)
必须编写调度foo() { foo_impl(); }程序的额外成本相当小,如果您将代码转换为多线程应用程序,为每个调用添加日志记录,或者使用计时器来验证每个调度执行的程度,它允许您稍后添加锁定机制. function ...由于派生类中实现的实际方法在此级别是私有的,因此可以保证所有多态调用都可以在一个点上进行检测:基础(这不会阻止扩展类进行foo_impl公开思考)
void Base::foo() {
scoped_log log( "calling foo" ); // we can add traces
lock l(mutex); // thread safety
foo_impl();
}
Run Code Online (Sandbox Code Playgroud)
如果虚方法是公共的,那么您无法拦截对方法的所有调用,并且必须将该日志记录和线程安全性添加到实现该接口的所有派生类.