声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见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,背是没有的,要去运用,运用之后去总结,必然收获很大。
后继文章:
阅读(2288) | 评论(1) | 转发(2) |