原帖由 ypxing 于 2008-5-19 17:15 发表
与面向过程相比,
面向对象提供了另外一种对现实问题建模的方法
面向对象语言只是对这种建模方式的支持
使用者(编程者)并不关心你的面向对象语言是怎么来的,
只关心该语言能不能提供面向对象建模时所 ...
原帖由 ypxing 于 2008-5-19 17:15 发表
与面向过程相比,
面向对象提供了另外一种对现实问题建模的方法
面向对象语言只是对这种建模方式的支持
使用者(编程者)并不关心你的面向对象语言是怎么来的,
只关心该语言能不能提供面向对象建模时所 ...
原帖由 ypxing 于 2008-5-19 17:23 发表
最理解面向对象的是习惯于使用面向对象方法建模的人,虽然他们并不见得会使用面向对象语言
最不理解面向对象的是计算机,
面向对象语言只是将面向对象建模者的思想转换为计算机能认识的01
我认为,建模方 ...
原帖由 zhujiang73 于 2008-5-19 21:41 发表
我是学了 C++ 以后,想了解 C++ 编译器自己默默做了什么工作。 参考 C 的面向对象实现,有助于理解 C++ 编译器的工作,因为 C 面向对象的实现过程在源码里都能看见,而最后的效果和 C++ 相似。
原帖由 flw 于 2008-5-19 17:00 发表
初学 OO 的话,还是从一个支持 OO 语法的语言开始吧。
当然,并不是说 C 就不可以 OO,
而是说,
无论是梁羽生笔下吕四娘的飞花摘叶皆可伤人,还是金庸笔下令狐冲的无招胜有招,
都是指融会贯通之后的一种上 ...
#include <stdio.h> typedef struct { int ma; } A; typedef struct { A parent; int mb; } B; int main (int argc, char *argv[]) { B b; B *pb; pb = &b; ((A*)pb)->ma = 1; pb->mb = 2; printf("b.ma = %d b.mb = %d \n", b.parent.ma, b.mb); return 0; } |
原帖由 zhujiang73 于 2008-5-20 14:43 发表
最简单的继承:
#include
typedef struct
{
int ma;
} A;
typedef struct
{
A parent;
int mb;
} B;
int main (int argc, char *argv[])
{
B b;
B *pb; ...
#include <stdio.h> typedef struct { void *p; int ma; } A; typedef struct { A parent; void *p; int mb; } B; typedef struct { void (*set_ma)(void *this, int a); } AC; typedef struct { AC parent; void (*set_mb)(void *this, int b); } BC; void A_set_ma(void *this, int a) { ((A*)this)->ma = a; } void B_set_mb(void *this, int b) { ((B*)this)->mb = b; } void AC_init(AC *pac) { pac->set_ma = A_set_ma; } void BC_init(BC *pbc) { AC_init((AC*)pbc); pbc->set_mb = B_set_mb; } void A_init(A *pa, AC *pac) { pa->p = (void*)pac; } void B_init(B *pb, BC *pbc) { pb->p = (void*)pbc; } int main (int argc, char *argv[]) { BC bc; B b1, b2; B *pb1, *pb2; pb1 = &b1; pb2 = &b2; BC_init(&bc); B_init(pb1, &bc); B_init(pb2, &bc); ((AC*)(pb1->p))->set_ma((void*)pb1, 10); ((AC*)(pb2->p))->set_ma((void*)pb2, 100); ((BC*)(pb1->p))->set_mb((void*)pb1, 20); ((BC*)(pb2->p))->set_mb((void*)pb2, 200); printf("b1.ma = %d b1.mb = %d \n", b1.parent.ma, b1.mb); printf("b2.ma = %d b2.mb = %d \n", b2.parent.ma, b2.mb); return 0; } |
原帖由 ypxing 于 2008-5-19 17:23 发表
最理解面向对象的是习惯于使用面向对象方法建模的人,虽然他们并不见得会使用面向对象语言
最不理解面向对象的是计算机,
面向对象语言只是将面向对象建模者的思想转换为计算机能认识的01
我认为,建模方 ...
原帖由 flw 于 2008-5-19 17:00 发表
初学 OO 的话,还是从一个支持 OO 语法的语言开始吧。
当然,并不是说 C 就不可以 OO,
而是说,
无论是梁羽生笔下吕四娘的飞花摘叶皆可伤人,还是金庸笔下令狐冲的无招胜有招,
都是指融会贯通之后的一种上 ...
原帖由 ypxing 于 2008-5-19 17:15 发表
与面向过程相比,
面向对象提供了另外一种对现实问题建模的方法
面向对象语言只是对这种建模方式的支持
使用者(编程者)并不关心你的面向对象语言是怎么来的,
只关心该语言能不能提供面向对象建模时所 ...
原帖由 zhujiang73 于 2008-5-19 16:49 发表
我想,理解了 C 的面向对象,也就理解了 C++ 。其实基本原理是一样的,只是 C++ 把一些工作自动化了。 最近在学 Gtk 中的对象系统 GObject ,顺便对比了一下 CU 中出了名的 oioic ,看来 oioic 的作者有一定水平 ...
原帖由 zhujiang73 于 2008-5-21 15:41 发表
加上成员函数:
#include
typedef struct
{
void *p;
int ma;
} A;
typedef struct
{
A parent;
void *p;
int mb;
} B;
typedef ...
#include <stdio.h> typedef struct { void *p; int ma; void (*vshow)(void *this); } A; typedef struct { A parent; void *p; int mb; char name[2]; } B; typedef struct { void (*set_ma)(void *this, int a); } AC; typedef struct { AC parent; void (*set_mb)(void *this, int b); } BC; void A_set_ma(void *this, int a) { ((A*)this)->ma = a; } void B_set_mb(void *this, int b) { ((B*)this)->mb = b; } void B_vshow(void *this) { printf("this is %s \n", ((B*)this)->name); } void AC_init(AC *pac) { pac->set_ma = A_set_ma; } void BC_init(BC *pbc) { AC_init((AC*)pbc); pbc->set_mb = B_set_mb; } void A_init(A *pa, AC *pac) { pa->p = (void*)pac; } void B_init(B *pb, BC *pbc) { ((A*)pb)->vshow = B_vshow; pb->p = (void*)pbc; pb->name[0] = 'B'; pb->name[1] = '\0'; } int main (int argc, char *argv[]) { BC bc; A *pa; B b1, b2; B *pb1, *pb2; pb1 = &b1; pb2 = &b2; BC_init(&bc); B_init(pb1, &bc); B_init(pb2, &bc); ((AC*)(pb1->p))->set_ma((void*)pb1, 10); ((AC*)(pb2->p))->set_ma((void*)pb2, 100); ((BC*)(pb1->p))->set_mb((void*)pb1, 20); ((BC*)(pb2->p))->set_mb((void*)pb2, 200); pa = (A*)pb1; pa->vshow((void*)pa); printf("b1.ma = %d b1.mb = %d \n", b1.parent.ma, b1.mb); printf("b2.ma = %d b2.mb = %d \n", b2.parent.ma, b2.mb); return 0; } |
原帖由 zhujiang73 于 2008-5-20 14:43 发表
最简单的继承:
#include
typedef struct
{
int ma;
} A;
typedef struct
{
A parent;
int mb;
} B;
int main (int argc, char *argv[])
{
B b;
B *pb; ...
原帖由 zhujiang73 于 2008-6-5 13:27 发表
驱动程序要有几个标准接口,类似 open(打开)、close(关闭)、read(读)、write(写)和 ioctl(输入输出控制),不同的驱动有不同的功能但接口相同,这样操作系统才能统一管理。至于多继承,比如说:我 ...
原帖由 ew3j 于 2008-6-5 14:04 发表
这是unix的一切都文件的思想, 支持多重继承么? 与OIOIC区别大去了, 它5个接口, OIOIC有9个接口, 而且实现机制也不同, 我猜的.
另外你说的移动指针应该让编译器做.
原帖由 zhujiang73 于 2008-6-5 14:52 发表
多重继承,统一接口。一切都文件的思想,和一切都 OIOIC 的思想,5个接口和9个接口, 我看差不多。unix 要求驱动有统一的接口,但是驱动程序中可以有自己的继承机制。 如果需要多重继承,可以写一组函数来 ...
原帖由 ew3j 于 2008-6-5 17:02 发表
那些工作OIOIC都已经做好了, 程序员只管用就是了. linux或unix 没有象OIOIC那样做, 它们需要程序员自己做, 有那个程序员愿意去做呢.
原帖由 zhujiang73 于 2008-6-5 19:51 发表
只是开始时需要写一组纪录类型信息的数据结构,和一组处理类型信息的函数,以后就简单了。很多 C 语言的大牛就是喜欢自己写函数库,用别人的不
爽。 我认为 OIOIC 对这类程序有一定参考 ...
原帖由 ew3j 于 2008-6-5 20:11 发表
你可能没看这个的#95楼,我看了这个才知道作者为什么把所有函数统一于9个接口:
http://topic.csdn.net/u/20080530 ... 7-8ade54b01d0c.html
原帖由 ew3j 于 2008-6-5 21:02 发表
你是说编码工作量大?
实际都一样的,只是以前用多个函数习惯了,乍一改方式不太适应,我想新的方式会更顺手,因为我们抓住了规律。
另外,最主要的是需要考虑对象的可维护可扩展性。
原帖由 zhujiang73 于 2008-6-5 21:17 发表
功能号适合机器处理,但函数名更符合人类习惯。 如果需要可以写一个接口包装函数,做中间转换工作,对象可以只显露这一个接口函数。我只用一个接口函数就行,不用 9 个,不是更好吗。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |