首页 > 其他分享 >Design OOP use C

Design OOP use C

时间:2024-05-28 22:13:39浏览次数:12  
标签:use struct void virtual base Design OOP tb class

Design OOP use C

使用c语言实现面向对象特性

以底层思维来理解面向对象。我所理解的oop:为不同的数据元提供稳定的处理逻辑框架,同时提供复写的可能,支持不同数据元个性化定制有限的逻辑;

多态特性:

基类实现一组通用处理逻辑接口,子类通过改变特定接口的执行逻辑实现将子类与个性化操作绑定;绑定的手段,C++中通过虚函数表来实现,这里使用类似的思路;

struct vritual_tb {
    void (*ofunc)(void *);
};
struct vritual_tb * virtual_tb_new(void (*overwrite_func)(void *));
void virtual_tb_delete(struct vritual_tb *);

struct base_class {
    char name[256];
    struct vritual_tb * ifunc;
    void * data;
};

// constructor
struct base_class * base_class_new(const char * name, struct vritual_tb * iface, void * data);
// destructor 
void base_class_delete(struct base_class *);

// virtual function
void base_class_call_virtual_func(struct base_class *);

类中组合虚函数表结构体,构造类对象时传入个性化动作的句柄(函数指针)构造虚函数表对象,用于实现重载函数:

void
base_class_call_virtual_func(struct base_class * obj) {
    struct vritual_tb * iface = obj->ifunc;
    if(!iface) {
        // basic operate
        return;
    }
    // overwrite operate
    iface->ofunc(obj->data);
}

用法:

void
overwrite_func(void * data) {
    // overwrite...
}

void * data = malloc(sizeof("test string"));
struct vritual_tb * iface = virtual_tb_new(overwrite_func);
struct base_class * instance = base_class_new("sub-1", iface, data);
base_class_call_virtual_func(instance);
base_class_delete(instance);
free(data);

数据元的生命周期管理交由使用方负责。

标签:use,struct,void,virtual,base,Design,OOP,tb,class
From: https://www.cnblogs.com/linxx-/p/18219023

相关文章

  • SAP:REUSE_ALV_LIST_DISPLAY 函数实现此类型ALV
    *&Report-1类型程序的主要功能是通过WRITE语句为用户提供方便的报表数据.*&与此功能类似的就是利用FUNCTIONALV创建的报表。利用*&REUSE_ALV_LIST_DISPLAY函数实现此类型ALV。*&---------------------------------------------------------------------**&Report......
  • SAP: REUSE_ALV_GRID_DISPLAY 函数实现此类型ALV
     *&Report-1类型程序的主要功能是通过WRITE语句为用户提供方便的报表数据.*&与此功能类似的就是利用FUNCTIONALV创建的报表。利用*&REUSE_ALV_GRID_DISPLAY函数实现此类型ALV。*----------------------------------------------------------------------**&-----......
  • Caused by: org.apache.catalina.connector.ClientAbortException: java.io.IOExcepti
    错误描述Causedby:org.apache.catalina.connector.ClientAbortException:java.io.IOException:你的主机中的软件中止了一个已建立的连接。发生场景ApiFox发起请求,接口内容是下载Excel文件,数据比较大5w条,在请求完之后发生此错误。但是在线上环境并没有这种情况,后来想了想......
  • hadoop学习之MapReduce案例:输出每个班级中的成绩前三名的学生
    hadoop学习之MapReduce案例:输出每个班级中的成绩前三名的学生所要处理的数据案例:1500100001施笑槐,22,女,文科六班,4061500100002吕金鹏,24,男,文科六班,4401500100003单乐蕊,22,女,理科六班,3591500100004葛德曜,24,男,理科三班,4211500100005宣谷芹,22,女,理科......
  • Hadoop学习之hdfs的操作
    Hadoop学习之hdfs的操作1.将HDFS中的文件复制到本地packagecom.shujia.hdfs;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.junit.After;importorg.junit.Before;importor......
  • React中何时使用memo、useCallback、useMemo以及useRef进行性能优化
    react无法做到像vue一样自动收集依赖更新(期待react19的ReactCompiler),需要开发人员手动的进行性能优化,此时memo、useCallback、useMemo、useRef就是性能优化中的重要API本文虽然介绍可应用场景,但是正常开发中,尤其是useCallback。除非遇到性能问题或者组件库封装,亦或......
  • 数据是如何写入到Hadoop HDFS中的?
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • Hadoop HDFS NameNode核心原理分析
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • 【问题记录】Cause: java.sql.SQLRecoverableException: No more data to read from s
    异常说明:   当Oracle客户端(应用)接收数据库服务器发送的数据时,它会从套接字中读取数据。如果在读取数据的过程中,套接字中没有更多的数据可供读取,那么Oracle客户端就会报告“没有更多数据从套接字读取”错误。常见原因:应用使用了连接池,当从连接池取得的connection失效或者超......
  • 什么?部署ClickHouse的服务器CPU利用率100%了?
    背景  某客户现场的ClickHouse所在服务器资源占用率100%了,引发了服务器告警。观察Grafana监控面板发现,从12点左右出现了大量的碎片写入,从而引起了相关指标的快速上升。  本文主要通过ClickHouse官方的系统表system.query_log表进行问题排查定位,结合Grafana监控面板最......