• 私有继承和虚函数私有化能用么?


    源起

    以前就知道private私有化声明关键字,和virtual虚函数关键字两者并不冲突,可以同时使用。
    但是,它所表示的场景没有那么明晰,也觉得难以理解,直到近段时间遇到一个具体场景。

    场景

    借助ACE遇到的问题进行展示

    架构图

    架构图

    序列图

    序列图

    说明

    • ACE_Message_Queueenqueue入队的时间,通过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_Handler<ACE_SOCK_Stream, ACE_MT_SYNCH>, private ACE_Notification_Strategy
    {
    public:
       typedef ACE_Svc_Handler<ACE_SOCK_Stream, ACE_MT_SYNCH> super;
        SomeExtendCls():ACE_Notification_Strategy(this, ACE_EventHanlder::WRITE_MASK)
        {
         ...
        }
      ...
    
    private:
      // Notification strategy APIs
      virtual int   notify (void)=0;
      virtual int   notify (ACE_Event_Handler *, ACE_Reactor_Mask mask)=0;
    
      ...
    
    }
    
    // implementation
    
    int SomeExtendCls::open(void *acceptor_or_connector)
    {
        if(super::open(acceptor_or_connector) == -1)
        {
          return -1;
        }
        
        ...
        
        // Set msg quque notifier
        this->event_handler(this);
        this->mask(ACE_EventHanlder::WRITE_MASK);
        this->msg_queue()->notification_strategy(this);
        
        ...
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    大数据算法系列9:字符串匹配问题,海量字符串处理
    Linux--网络编程-字节序
    重新定义每天进步一点点
    leaflet+vue2实现地图交互
    js获取当前月第一天最后一天
    Ubuntu下文件的解压缩操作:常用zip和unzip
    使用标准信号检测 VM振弦采集模块测量精度
    linux下telnet不能使用
    计算机毕业设计之java+ssm家校通网站
    呼之欲出的jvs低代码以及其他产品2.1.6版本能力大更新
  • 原文地址:https://blog.csdn.net/jkler_doyourself/article/details/133413699