用C表达面向对象语言的机制——C#版

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

     
 
大才!

 
     

支持(0)反对(0)

回复引用

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

     
 

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

 
     

支持(0)反对(0)

回复引用

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

     
 

@E8software
谢谢关注!

 
     

支持(0)反对(0)

回复引用

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

     
 

@[email protected]
谢谢夸奖!

 
     

支持(0)反对(0)

回复引用

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

     
 

楼主对C理解之深啊

 
     

支持(0)反对(0)

回复引用

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

     
 

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

 
     

支持(0)反对(0)

回复引用

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

     
 

有个玩意叫libCello

 
     

支持(0)反对(0)

回复引用

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

     
 

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

 
     

支持(0)反对(0)

回复引用

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

     
 

很用心,支持;

 
     

支持(0)反对(0)

回复引用

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

     
 

@FerventDesert
谢谢夸奖!

 
     

支持(0)反对(0)

回复引用

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

     
 

@王清培
谢谢支持!

 
     

支持(0)反对(0)

回复引用

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

     
 

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

 
     

支持(0)反对(0)

回复引用

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

     
 

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

 
     

支持(0)反对(0)

回复引用

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

     
 

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

 
     

支持(0)反对(0)

回复引用

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

     
 

学习了

 
     

支持(0)反对(0)

回复引用

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

     
 

好文

 
     

支持(0)反对(0)

回复引用

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

     
 

@艾斯泽
谢谢支持!

 
     

支持(0)反对(0)

回复引用

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

     
 

吊炸天

 
     

支持(0)反对(0)

回复引用

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

     
 

@SmartBooks

引用吊炸天
谢谢夸奖~

 
     

支持(0)反对(0)

回复引用

#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;

}

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

 
     

支持(0)反对(0)

回复引用

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

     
 

@Anti-Magic


1

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

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

 
     

支持(0)反对(0)

回复引用

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

     
 

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

 
     

支持(0)反对(0)

回复引用

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

     
 

哈哈,好文

 
     

支持(0)反对(0)

回复引用

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

     
 

@codingwu

引用哈哈,好文
谢谢!

 
     
时间: 2024-10-24 16:09:44

用C表达面向对象语言的机制——C#版的相关文章

面向对象语言的特点

---恢复内容开始--- 1.面向对象思想:万物皆对象,面相对象是更加符合人类思维模式的软件编程思想,比较简单,而且扩展性好. 2.拥有相同(或者类似)属性和行为的对象都可以抽像出一个类,类就像图纸,对象就是根据图纸制造出来的东西,实实在在存在的. 3. 类的设计,只关心3样东西: 事物名称(类名):人(Person) 属性:身高(height).年龄(age) 行为(功能):跑(run).打架(fight) 4.使用对象调用方法就是OC中的消息机制 5.面向对象语言的3大特点 封装性:封装性就

面向对象语言的缺点

刚开始接触java时,首先了解到的就是面向对象语言的四个基本特征 抽象 继承 封装 多态 以及一大堆面向对象语言的优点包括代码重用,权限控制,易扩展,开发效率高之类的,其实面向对象语言从诞生之日起就一直伴随着许多的缺陷,包括并不限于以下几点: 一.大大增加了代码量,包括非常多的冗余代码 对于面向过程语言来说,编程时需要哪些变量和方法就只编写这些变量和方法,而对于面向对象语言来说,每次无论你要使用什么都要先写一个类,并且每一个类都要有独立的变量和方法,这样就会造成可能很简单的问题也要很多的类代码,

面向对象语言的特征:封装、继承、多态

1. 面向对象语言的特征主要包括:封装:隐藏内部实现继承:复用现有代码多态:改写对象行为 1.1  封装封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性.封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的.封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象.

面向对象语言的多态性问题

一直以来在我们所见到的概念中,面向对象语言有三大特性:封装性.继承和多态. 封装性: 在面向对象的语言中存在有类的概念,因此实现了数据和行为(方法)的封装,在外部表现为统一的类或对象.在类的外部要访问类的公有成员(私有成员通过类或对象也是不能访问的),必须通过类名或对象来访问. 继承: 类的继承是在现有类的基础之上创建新的类,实现了代码的重用,并且扩展了现有类的功能的机制.关于继承方面,有的语言支持单继承和多继承(如C++),但有的语言只支持单继承(Java语言). 多态: 多态是程序设计语言的

两周自制脚本语言-第9天 设计面向对象语言

第9天 设计面向对象语言 目标:为Stone语言添加类和对象的支持.仅支持单一继承 9.1 设计用于操作类与对象的语法 添加的类与对象的处理功能后,下面的Stone语言就能被正确执行了 class Position { x = y = 0 def move(nx,ny) { x = nx; y = ny } } p = Position.new p.move(3, 4) p.x = 10 print p.x + p.y 首先定义一个Position类,方法由def语句定义.类中字段通过变量表示,

面向对象语言成员变量方法可见性在继承中的变化

最近做得的有点杂,接触到几种面向对象的语言,C#,C++,JAVA .在一个情景下,软件的框架已经写好了,我们要对其功能实现增加和修改,这种情况是经常发生的,那么在面向对象的程序设计中我们要怎么做呢.我们都知道面向对象语言有几个特点,多态,封装,继承,既然框架已经写好了,我们修改功能可以考虑用继承的方法去实现新的功能,那么这样做对原有的功能会有影响么?这就涉及到成员变量成员方法可见性在继承中的变化了. 首先,我们看C++ 派生类通过继承,将基类的成员作为自己的一部分,但不同的继承方式导致基类的成

结构化和面向对象语言的区别

Java语言是一门面向对象语言,C语言是一门结构化语言.而它们的区别在于结构化编程 是一整个时间为主,在将其分为一个个的小函数写出来:而面向对象语言试讲一个程序中的对 象拿来做文章,用代码来描述这些对象,从而完成整个程序.这个也是Java语言相对于C语言 更受程序员喜欢的原因.它减轻程序员的代码量. 了解到这些后我们就该了解如何实例化一个对象.它的形式是这样的: public class Employee{} 总共有3个东西:访问修饰符.数据类型和对象名称.

java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类的私有方法么?private()方法 答:可以,class取出method,method继承executable类,executable类继承AccessibleObject类,AccessibleObject有个setAccessiable()设置这个方法是否可访问. 则设置成true,就可将pr

脚本语言,面向对象语言,面向并发语言-杂谈

我 15:40 我看python写的是初学者的语言 这个有几层含义呢 是这个语言不够强大么? 永神 15:41 嗯 我 15:41 还是说这个语言简单易学? 永神 15:41 比较简单 应该是脚本类的语言 肯定不如JAVA C++强大 一般程序员,拿来作为一个辅助的技能 而不是专门作为一个职业 我 15:42 那java这些算什么语言啊 高级程序开发语言? 永神 15:42 JAVA啊,面向对象语言,是一个体系 高级程序语言指的是对计算机来说高级 我 15:43 那linux的shell呢?和p