Javascript多线程引擎(四)--之C语言单继承

  因为使用C语言做为开发语言, 而C语言在类的支持方面几乎为零, 而Javascript语言的Object类型是一个非常明显的类支持对象,所以这里需要提出一个方案对Object类型的继承进行支持.

  本章节介绍一个简单的基于C语言单继承结构的实现,  实现非常的简单, 但是体现了Java 的OO思想.

  

 ////Object.h
#ifndef _Object_
#define _Object_
/*******************
cls:
类似于Java的接口, 子类想对某个函数进行重载 ,
则只要在具体同名函数的位置替换掉原先的指针 .
而子类想访问被覆盖掉的父类同名函数, 则直接访问
父类的函数指针.
而私有函数, 则都在.c 文件中
pb:
公共数据结构, 数据结构在.h中
通过指针来访问自己的和父对象的公用数据
((struct Pb*)pb[0])->size ; 访问了跟对象的public block的size
sb:
私有的数据成员, 数据结构在.c中, 非本对象不可操作
((struct Sb*)sb[0])->size
FLOOR:
该对象处于继承链的第几个位置, Root 为 0
注: pb 和 sb的 数据槽 都由new Object的对象来申请空间
  初始化的方向为先初始化父类
  析构方向为先析构子类
********************/
struct Object;
//接口操作
typedef void (*PrintFn)(struct Object* self);
#define OBJECT_FLOOR 0
struct Class{
PrintFn p;
};
//公布的操作
struct Pb{
int size;
};
struct Object{
struct Class* cls;
void** pb;
void** sb;
};
void ObjectPrint(struct Object* self);
//申请基本的空间
//构建一个基本的空间, floor为子类所在的层, 根为第0层
struct Object* AllocObject(int floor);
//初始化对象
//如果o == NULL, 则Alloc一个空间
struct Object* CreateObject(struct Object* o);
#endif

  通过Cls公布类似java接口操作,  而pb 和 sb 分别为公布数据结构和私有数据结构, 并且私有函数都写在 .c 文件中.

  

 //Object.c
#include<stdlib.h>
#include<stdio.h>
#include"Object.h" struct Sb{
int num;
};
void ObjectPrint(struct Object* self){
struct Pb* p;
struct Sb* s;
p = (struct Pb*)self->pb[OBJECT_FLOOR];
s = (struct Sb*)self->sb[OBJECT_FLOOR];
printf("root Object Pb: %d\n root Object Sb: %d\n", p->size,s->num);
}
//申请基本的空间
//构建一个基本的空间, floor为子类所在的层, 根为第0层
struct Object* AllocObject(int floor){
if(floor <= ){
//error
}
floor ++;
struct Object* o;
o = (struct Object*)malloc(sizeof(struct Object));
o->cls = (struct Class* )malloc(sizeof(struct Class));
//数据槽
o->pb = (void**) malloc(sizeof(void*) * floor );
o->sb = (void**) malloc(sizeof(void*) * floor );
} //初始化对象
//如果o == NULL, 则Alloc一个空间
struct Object* CreateObject(struct Object* o){
if(o == NULL)
o = AllocObject(OBJECT_FLOOR);
//初始化pb数据块
o->pb[OBJECT_FLOOR] = (struct Pb*)malloc(sizeof(struct Pb));
//初始化sb数据块
o->sb[OBJECT_FLOOR] = (struct Sb*)malloc(sizeof(struct Sb));
o->cls->p = &ObjectPrint;
((struct Pb*)o->pb[OBJECT_FLOOR])->size = ;
((struct Sb*)o->sb[OBJECT_FLOOR])->num = ;
return o;
}

私有数据结构实现在.c 中,  私有函数也实现在.c 中

而下面就是一个简单的Object2.h 对象

 ///Object2.h
#ifndef _Object2_
#define _Object2_
#define OBJECT2_FLOOR 1
#include"Object.h"
//新子类的共享数据
struct Pb2{
int size;
};
void ObjectPrint2(struct Object* self);
struct Object* CreateObject2(struct Object* o);
#endif

Object2.h  实现了自己的数据结构 和公布了一个多态函数

 ///Object2.c
#include"Object.h"
#include"Object2.h"
#include<stdio.h>
#include<stdlib.h>
void ObjectPrint2(struct Object* self){
struct Pb2* p = (struct Pb2*)self->pb[];
printf("Object2 : %d \n",p->size);
ObjectPrint(self);
}
struct Object* CreateObject2(struct Object* o){
if(o == NULL)
//处于继承链第一个位置
o = AllocObject(OBJECT2_FLOOR);
//初始化父对象
CreateObject(o);
//初始化pb数据块
o->pb[OBJECT2_FLOOR] = malloc(sizeof(struct Pb2));
//初始化sb数据块
o->sb[OBJECT2_FLOOR] = NULL;
//重载
o->cls->p = &ObjectPrint2;
((struct Pb2*)o->pb[OBJECT2_FLOOR])->size =;
return o;
}

在第9行 , 调用了父类的该同名函数.

以下是一个基本的测试:

////main.c
#include"Object2.h"
#include<stdlib.h>
int main(){
struct Object* o = CreateObject2(NULL);
o->cls->p(o);
}

编译命令:

gcc -c Object.c

gcc -c Object2.c

gcc -c main.c Obejct.o Object2.o

./a.out

测试成功!

  通过pb 的连续内存块, 在继承结构中, 对象只能看到它自己和父对象的内存结构, 而不能发现该对象的子对象内存结构, 而父对象则照常使用属于他自己的内存空间, 从而实现了信息隐藏.

并且每个对象的访问数据和操作都是统一的(主要是父对象):

1. 子对象指针和父对象指针都可以通过pb数据块进行操作自己的数据(从共享内存中找到自己的内存地址)

2. 子对象和父对象指针访问API都指向正确的实现(可以访问重载函数)

3. 私有数据都是从sb数据块获取

  C语言的继承和多态主要的核心是内存结构和CPU访问数据和函数的方式(参考C++对象继承内存模型), 或者采用动态语言的机制进行查询访问.

源代码:

  http://files.cnblogs.com/tickobject/src.zip

项目代码地址:

github.com/darkgem/js-engine

Javascript多线程引擎(四)的更多相关文章

  1. Javascript多线程引擎(七)

    Javascript多线程引擎(七)--synchronized关键字 经过两天的努力, 今天synchronzied关键字终于支持了, 如下是测试代码 thread() 是一个开启新线程的API, ...

  2. Javascript多线程引擎(十)---Web服务器

     Javascript多线程引擎(十)---Web服务器 经过一天的努力, 引擎可以支持web服务的功能了并且支持UTF-8的编码, 具有对HTTP参数的解析,状态码的配置, 响应报文的输出等. 提供 ...

  3. Javascript多线程引擎(九)

    Javascript多线程引擎(九)--垃圾回收 垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep ...

  4. Javascript多线程引擎(八)

    Javascript多线程引擎(八)    Javascript 多线程项目, 做到现在已经快3个月了(加上前期准备编译原理和必要的文档), 该项目(js-engine)已经快进入尾声了, 现在该引擎 ...

  5. Javascript多线程引擎(六)

    Javascript多线程引擎(六) 经过三个月的时间, Javascript 引擎已经完成beta版本(还不支持多线程特性, 预计下个星期就可以支持了, 现阶段还在进行测试基本JS单元功能), 并且 ...

  6. Javascript多线程引擎(五)

    Javascript多线程引擎(五)之异常处理 C语言没有提供一个像Java一样的异常处理机制, 这就带来了一个问题, 对于一个子函数中发生异常后, 需要在父函数调用子函数的位置进行Check, 如果 ...

  7. Javascript多线程引擎(三)

    Javascript多线程引擎(三) 完成对ECMAScript-262 3rd规范的阅读后, 列出了如下的限制条件 1. 去除正则表达式( 语法识别先不编写) 2. 去除对Function Decl ...

  8. Javascript多线程引擎(一)

    Javascript多线程引擎(一) Javascript 天生是单线程的语言, 不支持synchronized等线程操作, 但是这便不妨碍Javascript作为web语言中最具有魅力语言之一. 虽 ...

  9. Javascript多线程引擎(二)

    多线程Javascript解释器的大致架构 由于一个完整的解释器类似Google V8的解释器需要的工作量非常的大如需要实现如下的模块: 词法分析,语法分析器,AST转Byte模块,解释执行模块和JI ...

随机推荐

  1. Matlab中调用第三方Java代码

    搞了一天,才算搞定. 第一步:定位Matlab中Java环境的ext目录 新建一个M script文件,或者直接在Matlab的交互式命令行中输入: disp(java.lang.System.get ...

  2. Group By去除重复数据

    今天在写一个sql,目的是去除表里某一个字段相同的数据,只保留最新的一条.之前group by 用的少.特此记录一下. SELECT * FROM litb_approval_task SELECT ...

  3. linux awk命令详细使用方法

    简单介绍 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部 ...

  4. Qt Quick 布局演示

    于 Qt Widgets 于,我们经常使用许多布局管理器来管理界面 widgets . 于 Qt Quick 实际上,有两个相关的管理和布局库,所谓集 Item Positioner ,所谓集 Ite ...

  5. EJBCA于Linux安装在

    于windows为了测试安装,装在linuxserver因为CN使用ip需要重新加载.....再折腾.这里有一些地方需要注意 一.所需文件 内容准备不说,请参阅我在以前的文章<EJBCA于win ...

  6. 我国常用的坐标系统WKID列表[转]

    原文链接:http://blog.sina.com.cn/s/blog_62f9ffcd0102uw8x.html Geographic Coordinate System 地理坐标 4214  GC ...

  7. hdu1297 Children’s Queue

    再加上男人:dp[i-1]: 加2一个女人:dp[i-2]+x. 上述的另一种情况下dp[i-2]它不仅包括加2女人对法律状况.和x是一个加号ff原违法的法律案后加入,这最后是mf案例,然后,x=dp ...

  8. Java 实现装饰(Decorator)模式

    在Java在.io反映非常多类包下是典型的装饰格局,例如: new BufferedOutputStream(OutputStream out) new BufferedInputStream(Inp ...

  9. 数据结构与算法之递推算法 C++与PHP实现

    数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这样的算法的数据结构.一种数据结构假设脱离了算法,也就没有存在的价值了. 算法的作用----解决 ...

  10. 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...