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