+ -
当前位置:首页 → 问答吧 → 我对C与OO的理解

我对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.
封装变化的部分,组合优于继承,对接口编程,而不是实现。

有了这些基本概念,看看高级语言的实现。图如下:
下载 (13.7 KB)
2010-07-20 21:59


Man Woman 都继承Person,把一些共同的属性封装到了Parent类里,这体现了Encapsulation
和Inheritance。对于do()方法是抽象方法,所以子类必须去实现,这样在实际的代码中就
可以利用多态了,例如Persion p = getPersion(flag); p.do(if)这样只有在执行期间才能判断
p的类型,有了OO这些基础,在来看看C怎么实现呢?其实实现也很简单,但是要熟练
运用就看你对OO的掌握程度了。

实例代码如下
  1. Persion p = getPersion(flag);
  2. p.getName();
  3. p.do(if);

  4. Man m = (Man) p;
  5. Persion p2 = (Persion) m;
复制代码
C虽然没有OO的概念,但是如果想写出易扩展,易维护的source code,你就必须掌握C的隐性OO概念。
看看C的结构图:

代码如下
  1. Persion* p = getPersion(flag);
  2. p->opt->getName();
  3. p->opt->do((void*)&if);

  4. Struct Man * m = (Struct Man *) p;
  5. Struct Persion * p2 = (Struct Persion *) m;
复制代码
看看代码是不是很像啊,除了操作符不同之外,基本都一样。看到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,背是没有的,要去运用,运用之后去总结,必然收获很大。

作者: mtloveft   发布时间: 2010-07-20

C还没太用过面向对象,还是模块化的开发

作者: linux初学三月   发布时间: 2010-07-20

可能是开发思路吧,如果开始就用OO思想去做,估计用C会很累。。。

作者: kgn28   发布时间: 2010-07-20

热门下载

更多