我对C与OO的理解
时间:2010-07-20
来源:互联网
本帖最后由 mtloveft 于 2010-07-20 22:06 编辑
提示:本文是介绍C是如何实现OO!
blog: http://oldtown.cublog.cn/
URL: http://blog.chinaunix.net/u3/114767/showart_2277244.html
OO的基础就是abstraction, encapsulation, polymorphism ,inheritance。
也就是抽象,封装,多态,继承。
OOD的基础就是
Encapsulate what varies.
Favor composition over inheritance
Program to interfaces, not implementations.
封装变化的部分,组合优于继承,对接口编程,而不是实现。
有了这些基本概念,看看高级语言的实现。图如下:
Man Woman 都继承Person,把一些共同的属性封装到了Parent类里,这体现了Encapsulation
和Inheritance。对于do()方法是抽象方法,所以子类必须去实现,这样在实际的代码中就
可以利用多态了,例如Persion p = getPersion(flag); p.do(if)这样只有在执行期间才能判断
p的类型,有了OO这些基础,在来看看C怎么实现呢?其实实现也很简单,但是要熟练
运用就看你对OO的掌握程度了。
实例代码如下
复制代码
C虽然没有OO的概念,但是如果想写出易扩展,易维护的source code,你就必须掌握C的隐性OO概念。
看看C的结构图:

代码如下
复制代码
看看代码是不是很像啊,除了操作符不同之外,基本都一样。看到C的OO实现了吧。
其实C也有继承的,你如果了解OO语言的继承是怎么实现的,那就会知道C怎么
实现了,OO语言继承的数据放置位置,首先放父类的数据,然后放自己的数据。
图如下:

比如实例GTT : Persion的数据layout如下:

这样在C就很容易实现了。定义两个struct,把一个struct的定义放到另外一个struct的定义最前头,
这样就是OO的继承的实现了,可以互相转换类型,如果把一个struct放到另一个struct的其他
位置,就可以理解为包含了,也就是composition, has-A关系。
OO设计不难,但你要掌握它的精髓,他要达到什么效果,
精髓就是flexable,maintainable,resuable这3个单词。即柔软,可维护,可重用。这样设计的工程中时刻考虑这些,必然会设计出greate
software了,当我看到linux的实现时,感到写linux这些人太他妈的有才了。
在以上的代码中,如果把取得p的过程放到另外的一个类里,就可以理解为是一个factory design pattern了。把一些变化的方法抽象到另外的一个类里,是不是跟bridge design pattern 很象呢,
本没路,走的人多了就有路了。design pattern 本没有,只是你用的多了,就掌握精髓了。
那么多design pattern,背是没有的,要去运用,运用之后去总结,必然收获很大。
提示:本文是介绍C是如何实现OO!
blog: http://oldtown.cublog.cn/
URL: http://blog.chinaunix.net/u3/114767/showart_2277244.html
OO的基础就是abstraction, encapsulation, polymorphism ,inheritance。
也就是抽象,封装,多态,继承。
OOD的基础就是
Encapsulate what varies.
Favor composition over inheritance
Program to interfaces, not implementations.
封装变化的部分,组合优于继承,对接口编程,而不是实现。
有了这些基本概念,看看高级语言的实现。图如下:
Man Woman 都继承Person,把一些共同的属性封装到了Parent类里,这体现了Encapsulation
和Inheritance。对于do()方法是抽象方法,所以子类必须去实现,这样在实际的代码中就
可以利用多态了,例如Persion p = getPersion(flag); p.do(if)这样只有在执行期间才能判断
p的类型,有了OO这些基础,在来看看C怎么实现呢?其实实现也很简单,但是要熟练
运用就看你对OO的掌握程度了。
实例代码如下
- Persion p = getPersion(flag);
- p.getName();
- p.do(if);
-
- Man m = (Man) p;
- Persion p2 = (Persion) m;
看看C的结构图:

代码如下
- Persion* p = getPersion(flag);
- p->opt->getName();
- p->opt->do((void*)&if);
-
- Struct Man * m = (Struct Man *) p;
- Struct Persion * p2 = (Struct Persion *) m;
其实C也有继承的,你如果了解OO语言的继承是怎么实现的,那就会知道C怎么
实现了,OO语言继承的数据放置位置,首先放父类的数据,然后放自己的数据。
图如下:

比如实例GTT : Persion的数据layout如下:

这样在C就很容易实现了。定义两个struct,把一个struct的定义放到另外一个struct的定义最前头,
这样就是OO的继承的实现了,可以互相转换类型,如果把一个struct放到另一个struct的其他
位置,就可以理解为包含了,也就是composition, has-A关系。
OO设计不难,但你要掌握它的精髓,他要达到什么效果,
精髓就是flexable,maintainable,resuable这3个单词。即柔软,可维护,可重用。这样设计的工程中时刻考虑这些,必然会设计出greate
software了,当我看到linux的实现时,感到写linux这些人太他妈的有才了。
在以上的代码中,如果把取得p的过程放到另外的一个类里,就可以理解为是一个factory design pattern了。把一些变化的方法抽象到另外的一个类里,是不是跟bridge design pattern 很象呢,
本没路,走的人多了就有路了。design pattern 本没有,只是你用的多了,就掌握精髓了。
那么多design pattern,背是没有的,要去运用,运用之后去总结,必然收获很大。
作者: mtloveft 发布时间: 2010-07-20
C还没太用过面向对象,还是模块化的开发
作者: linux初学三月 发布时间: 2010-07-20
可能是开发思路吧,如果开始就用OO思想去做,估计用C会很累。。。
作者: kgn28 发布时间: 2010-07-20
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28