OOinC(1):C语言中的类模拟和多态,继承
在面向对象语言中,出现了类的概念。这是编程思想的进化。类:对特定数据的特定操作的集合。所以类包括两类:数据和操作。而C语言中的struct只是数据的集合。
1。例子:先说一个小例子# ifndef c _ class # define c _ class struct # endif c _ classa { c _ classa * a _ this;void(* Foo)(C _ Class A * A _ this);int a;int b;};C_Class B{ //B继承了一个c _ classb * b _ this//顺序重要void(* foo)(c _ classb * b this);//虚函数int a;;int b;int c;};void B _ F2(C _ Class B * Bthis)
{ printf("是B _ Fun \ n ");} void A _ Foo(C _ Class A * at his)
{ printf(" It is A . A = % d \ n ",at his-> A);//或者这里//退出(1);// printf("不允许执行纯虚拟\ n ");//或者这里} void b _ foo(c _ class b * Bt this-> c);
{ printf(" it is b . c = % d \ n ",bthis-> c);} void A _ Creat(struct a* p)
{ p-> Foo = A _ Foo;p-> a = 1;p-> b = 2;p-> A _ this = p;} void B _ Creat(struct B * p)
{ p-> Foo = B _ Foo;p-> a = 11;p-> b = 12;p-> c = 13;p-> B _ this = p;} int main(int argc,char * argv[])
{ C _ Class A * ma,A;C _类*mb,B;a _ Creat(& a);//实例化b _ create(& b);MB = & b;ma = & a;ma =(C _ Class A *)MB;//引入多态指针printf("%d\n ",ma-> a);//可惜函数变量没有privatema-> foo(ma);//多态性a . foo(& a);//B _ F2 (&b)不是多态的;//成员函数,因为效率问题不使用函数指针return0}输出结果:11是b.c = 13是a.a = 1是b _ fun2。类模拟讲解:我在网上看过一篇文章,讲了一个类似的思路(据说还有更详细的c++编程思路的讲解,可惜我没看这个空。如果有人知道,请告诉我)。但正如C++之父所说,“C++和C是两种语言”。所以不要被它们语法上的相似所迷惑,这可能会导致意想不到的事情。
其实我很赞同这个观点。本文的目的不是用C模拟c++,用一种语言模拟另一种语言完全没有意义。我的目的是解决C语言中整体框架结构过于分散,数据和功能脱节的问题。
C语言的一个大问题就是结构松散。虽然所有好的大型程序基本都是按照一个函数一个文件的方式设计的,但是却无法做到更小的粒度——原因就在于其数据和函数的脱节。这就是类和普通函数集合的区别。类可以被实例化,这样同一个函数可以对应不同实例化类的变量。
自然语言的一个特点就是泛化:比如表格。你可以说手表、钟、秒表等。这样的描述在面向对象语言中可以说是抽象的(继承和多态)。但我们更要注意的是,即使对应了手表类别,仍然有表链长度、表盘颜色等细节属性。如果这样微妙的属性仍然被抽象,那么类扩展的问题就无法避免。所以这个类使用成员变量来描述这样的属性。这样,通过实例化和初始化不同的类,描述了具有不同属性的对象。
但是在C语言中,这是不可能的(至少语言本身没有提供这样的功能)。在C中,如果每个函数想要共享一个变量,它必须使用一个全局变量(在一个文件中)。但是全局变量不能再次实例化。所以通常的方法是定义一个数组。在以前,这是C语言处理这类问题的通常方式。比如插座的数量,韩德尔等。其实是数组的下标。(不同的连接对应不同的号码,不同的窗口对应不同的handel。事实上,这意味着不同的类有不同的成员变量。)
个人认为两种形式(数组和模拟类)没有本质区别(如果不考虑虚函数的应用)。他们的区别在于array的方法会空。
[br/]3。换句话说:我的上述思想还很不成熟。我的目的是让C语言程序员享受到更多面向对象编程的乐趣。我们面对的只是一个巨大的“黑匣子”。我们的工作就是把代码堆起来,如果要改变代码的功能,只需要改变黑盒就可以了。
而更大的目的是推动这样一个黑盒的产生。也许有一天,会出现一种效率和结构都很好的语言。那时编程会像说话一样容易吗?
0条评论