企业信息公共服务平台官网,地方房地产网站seo实战案例分享,wordpress 下拉框图标,装修设计工作室推荐源起
以前就知道private私有化声明关键字#xff0c;和virtual虚函数关键字两者并不冲突#xff0c;可以同时使用。 但是#xff0c;它所表示的场景没有那么明晰#xff0c;也觉得难以理解#xff0c;直到近段时间遇到一个具体场景。
场景
借助ACE遇到的问题进行展示
…源起
以前就知道private私有化声明关键字和virtual虚函数关键字两者并不冲突可以同时使用。 但是它所表示的场景没有那么明晰也觉得难以理解直到近段时间遇到一个具体场景。
场景
借助ACE遇到的问题进行展示
架构图 序列图 说明 ACE_Message_Queue在enqueue入队的时间通过notification_strategy接口可定制入队列的通知事件以实现某些过程间的桥接 ACE_Svc_Handler因为继承ACE_Task具有线程能力和消息队列和继承ACE_Event_Handler事件处理机制以及内聚了Reactor在使用方消息请求入队后ACE_Svc_Handler通过handle_output接口可将消息外发出去。 通过handle_output机制可以实现套接字的异步发送能力和消息缓冲机制。具体借助Reactor监控套接字的writable事件即使出现部分成功发送的场景也能够予以很好的解决见前面博客详述如何解决TCP部分发送成功 如何定制化数据入队通知策略
我们可以选择定制通知策略类notification strategy内聚成为成员变量但此成员变量又需要访问容器类的详细状态以避免过度的通知所以两者的关系十分密切和相互依赖甚至需要用到类前置声明来解决问题。
既然这么密切如果选择用继承呢但首先遇到的是判断问题它们之间是is a还是has a关系确实选择继承在is a概念比较勉强因为它仅供自身使用并不通用
那么使用私有继承呢而且涉及到的ACE_Notification_Strategy所有虚函数接口也均采用private关键字进行修饰以避免外界显式访问是否就达到比较好的适应呢
结束语
继承能不能用甚至私有继承能不能用虚函数能不能私有化如果场景适合何乐而不为呢 ACE优良的类设计保证了多继承之间也不会出现太多命名冲突实在是高明的设计 例子 class SomeExtendCls: public ACE_Svc_HandlerACE_SOCK_Stream, ACE_MT_SYNCH, private ACE_Notification_Strategy
{
public:typedef ACE_Svc_HandlerACE_SOCK_Stream, ACE_MT_SYNCH super;SomeExtendCls():ACE_Notification_Strategy(this, ACE_EventHanlder::WRITE_MASK){...}...private:// Notification strategy APIsvirtual int notify (void)0;virtual int notify (ACE_Event_Handler *, ACE_Reactor_Mask mask)0;...}// implementationint SomeExtendCls::open(void *acceptor_or_connector)
{if(super::open(acceptor_or_connector) -1){return -1;}...// Set msg quque notifierthis-event_handler(this);this-mask(ACE_EventHanlder::WRITE_MASK);this-msg_queue()-notification_strategy(this);...
}