C语言单继承实现和使用

C语言单继承实现和使用

  1. 在研究给awtk添加一种输入法的时候,发现一个有意思的技巧。仿佛是C 语言中的继承的实现。

  2. AWTK中给出了输入法引擎的接口,方便用户添加自己的输入法。其内部架构如图所示。

    在这里插入图片描述

  3. 我现在想要加一个自己的输入法。

    在这里插入图片描述

  4. 但是每种输入法差别比较大,只是一个engine的对象可能没有办法满足需求。比如九宫格和韩文输入法之间的差别。

    在这里插入图片描述

    如图,输入法的基本操作就是open/close/input ,打开,关闭,输入操作。但是因为具体情况不同,需要不同的数据结构来处理问题。

  5. 我以前的思路,往往是在engine的结构体中添加一个成员,指向可以扩展的数据。

    typedef struct input_engine_t
    {
        int key;//按键输入的key值。
        function create; //创建输入法引擎的时候的回调。
        function destroy;//销毁输入法引擎的时候的回调。
        function input;//当有按键输入的时候回调。
        
        void *data_t; //指向用户需要添加的数据结构,比如,korean_input_engine/t9_input_engine
    }input_engine_t;
    
    /*
    	韩文输入法的结构体
    */
    typedef struct korean_input_engine_t
    {
        input_engine_t *p_engine;
        int timer;
        int mode;
        char buff[MAX_LEN];
    }korean_input_engine_t;
    
    /*
    	九宫格输入法的结构体
    */
    typedef struct t9_input_engine_t
    {
        input_engine_t *p_engine;
        int timer;
        int mode;
    }t9_input_engine_t;
    
  6. 使用5中的思路,需要每次获取具体的用户数据data,然后在针对性的做操作。而且 data_t 的结构中,也需要有成员指向input_engine_t结构。需要作者维护input_engine_t 和具体输入法的映射关系。这的确是一种增加可读性的方法。

  7. 而这里,awtk给的t9例子中,使用了c语言实现的单继承。也就是这样:

    /*
    	1、这样写,只需要创建的时候 统一创建 t9_input_engine_t 大小的输入法引擎就可以。
    	2、想要访问 input_engine_t 的时候,直接 将 t9_input_engine_t 指针强制转换成 input_engine_t,访问就可以。
    	3、同理,想要访问 t9_input_engine_t 的时候,可以直接将 input_engine_t 的指针强制转换成 t9_input_engine_t 就可以。
    	4、这样写的好处相比较5中的方法,是少了input_engine_t 和 具体 输入法引擎的对应关系。使用5中的方法,需要注意当前的 input_engine_t 指向的data究竟是哪个 输入法。但是使用这种方法不需要。
    	5、感觉这样表达的意思更加的饱满。能表达父类和子类的从属关系。
    */
    typedef struct t9_input_engine_t
    {
        input_engine_t engine;//必须放在开头位置。
        int timer;
        int mode;
    }t9_input_engine_t;
    
    typedef struct korean_input_engine_t
    {
        input_engine_t engine;//必须放在开头位置。
        int timer;
        int mode;
        char buff[MAX_LEN];
    }korean_input_engine_t;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值