Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1007139
  • 博文数量: 442
  • 博客积分: 1146
  • 博客等级: 少尉
  • 技术积分: 1604
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 12:52
个人简介

123

文章分类

全部博文(442)

文章存档

2017年(3)

2016年(15)

2015年(132)

2014年(52)

2013年(101)

2012年(110)

2011年(29)

分类:

2012-01-18 22:15:20

原文地址:C与OO 作者:mtloveft

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
提示:本文是介绍C是如何实现OO
 
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虽然没有OO的概念,但是如果想写出易扩展,易维护的source code,你就必须掌握C的隐性OO概念。
看看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语言的继承是怎么实现的,那就会知道C怎么
实现了,OO语言继承的数据放置位置,首先放父类的数据,然后放自己的数据。
图如下:
 
比如实例Persion:GTT的数据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,背是没有的,要去运用,运用之后去总结,必然收获很大。
 
后继文章:
阅读(550) | 评论(0) | 转发(0) |
0

上一篇:C与多层继承

下一篇:C与Observer design pattern

给主人留下些什么吧!~~