首页 > 技术文章 > 用C表达面向对象语言的机制——C#版

viewcozy 2015-12-14 15:13 原文

http://www.cnblogs.com/bitzhuwei/p/Write_CSharp_In_C.html#_lab2_2_0

 

     
 

大才!

 
     
#2楼 2013-10-08 11:57 E8software  
     
 

谢谢分享。顺便,楼主,我把你关注了。

 
     
#3楼[楼主] 2013-10-08 14:04 BIT祝威  
     
 

@E8software
谢谢关注!

 
     
#4楼[楼主] 2013-10-08 14:06 BIT祝威  
     
 

@Alan@Net
谢谢夸奖!

 
     
#5楼 2013-10-08 16:42 fishkuro  
     
 

楼主对C理解之深啊

 
     
#6楼[楼主] 2013-10-08 16:54 BIT祝威  
     
 

@fishkuro
我只是用了最基本的C的内容,struct,函数指针,void*指针。仅此而已。

 
     
#7楼 2013-10-08 17:14 www378660084  
     
 

有个玩意叫libCello

 
     
#8楼 2013-10-08 19:01 FerventDesert  
     
 

给大神跪了,以前我也想写这方面内容的,只可惜水平有限未能完成。。。牛

 
     
#9楼 2013-10-09 07:57 王清培  
     
 

很用心,支持;

 
     
#10楼[楼主] 2013-10-09 08:49 BIT祝威  
     
 

@FerventDesert
谢谢夸奖!

 
     
#11楼[楼主] 2013-10-09 08:50 BIT祝威  
     
 

@王清培
谢谢支持!

 
     
#12楼[楼主] 2013-10-09 08:51 BIT祝威  
     
 

@www378660084
我是想弄清楚如何把C#翻译为C。直接使用libCello人人都会,如何设计编写libCello才是我感兴趣的。

 
     
#13楼 2013-10-10 10:45 Yuxi Liu  
     
 

写的很好。 
只是我觉得C的工程有C工程的结构,没有必要非要模仿面向对象语言的特性吧。在一个C的工程里,一般都是时间驱动。 结构非常清晰。

 
     
#14楼[楼主] 2013-10-10 14:27 BIT祝威  
     
 

@Yuxi Liu
没错。我只是用C来说明将面向对象语言翻译为面向过程语言的方法。实际工程中是不必用这种方式写C代码的。需要的时候,直接用C++、Java、C#等等面向对象的语言就可以了。

 
     
#15楼 2013-10-21 13:33 john23.net  
     
 

学习了

 
     
#16楼 2014-02-27 20:29 艾斯泽  
     
 

好文

 
     
#17楼[楼主] 2014-03-03 09:11 BIT祝威  
     
 

@艾斯泽
谢谢支持!

 
     
#18楼 2014-06-10 16:39 SmartBooks  
     
 

吊炸天

 
     
#19楼[楼主] 2014-06-10 17:09 BIT祝威  
     
 

@SmartBooks

引用吊炸天

谢谢夸奖~

 

 
     
#20楼 2014-07-03 21:05 Anti-Magic  
     
 

楼主厉害!
刚看到楼主这篇博客,不算挖坟吧。。
在类似Lua的脚本语言中,模拟调用类方法也是跟楼主类似的做法,但是有语法糖可以更好看一点,例如class:func(1, 2),就是把class作为func的第一个参数,另外的1和2是第二和第三个参数,所以C语言版也可以稍微改进一下:

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
#include <stdio.h>
#include <stdlib.h>
 
//F宏模拟调用类方法,格式为F(类名,方法名,传给方法的参数)
#define F(_class, _func, ...) _func(_class, ##__VA_ARGS__)
 
typedef struct
{
    int number;
} *MyClass; //MyClass当做类来用,隐去了指针符号
 
//模拟new运算符
MyClass newMyClass()
{
    MyClass res = (MyClass)malloc(sizeof(MyClass));
    //初始化
    res->number = 521;
    return res;
}
 
//类方法
void myfunc(MyClass mc, char str[], int x)
{
    printf("%d %s %d\n", mc->number, str, x);
}
 
int main()
{
    MyClass myclass = newMyClass();
    F(myclass, myfunc, "aaa", 2);
    return 0;
}

这是看了楼主的博客后做的实践,没有在实战中用过,不知道说的有没有错,请多多指教。。

 

 
     
#21楼[楼主] 2014-07-03 22:53 BIT祝威  
     
 

@Anti-Magic

1
MyClass res = (MyClass)malloc(sizeof(MyClass));

这里的sizeof(MyClass)应该用错了。不过想表达的意思我明白是对的。
使用F宏有什么好处?我觉得直接使用myfunc(myclass, "aaa", 2);似乎更直观。另外我不喜欢用宏(一旦用错很难调试)

 

 
     
#22楼 2014-07-04 01:06 Anti-Magic  
     
 

@BIT祝威
malloc确实写错了。。。谢谢指教!
F宏就是单纯的模拟一下某些过程式脚本语言实现面向对象的语法糖,也就是隐去第一个参数而已,别的好处暂时没发现。。(写了宏好像变的更长了。。)
不过新标准有了inline、const、bool,宏的作用确实小了不少。
看一些开源项目总是喜欢一些丧心病狂的宏,比如 “#define end }”。
我也觉得少用应该是好的。

 
     
#23楼 2014-07-04 20:23 codingwu  
     
 

哈哈,好文

 
     
#24楼[楼主] 2014-07-04 21:36 BIT祝威  
     
 

@codingwu

引用哈哈,好文

谢谢!

 

 
     

推荐阅读