使用C开发已经快1年多了, 公司只用C, 但在有时设计要考虑到面向对象. 总感觉自己的设计很成问题, 现在重新复习以下, 其中有些就是自己
一时的想法和感受. "<>"中的内容为自己后加的.
学习原文来源于:
面向对象程序设计基础知识:
程序语言:本身实际上是对一个现实问题的描述;其发展的根本问题在于如何更加接近人的自然思维。(机器->汇编->高级语言;面向过程->面向对象)<什么时候编程同说话一样就好了, 目标是"如何更接近自然思维", 写程序时间长了就容易忘了这条.>
面向对象:
一种软件方法(方法学),而不仅仅限于程序设计语言,更重要的是如何看待世界。<改变思想才是面向对象的根本>
基本思想:从现实世界中客观存在的事务(对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。
面向对象程序设计语言:
定义:机器实现的定义。
数据和操作在一起,内存块可以复制副本<"数据和操作在一起", 在C中struct就是数据和操作分开的, 如何让C也可以将数据和操作一起呢?>
对象间通过函数调用实现通信;对象的继承
关键要素:<这四点可是每次考试, 面试必考的啊. 要真理解会用还真的不容易啊!>
抽象:忽略事物的非本质特性,只注意与当前目标有关的本质特征,从而找出事物的共性;把具有共同性质的事物划为一类,得到一抽象的概念。
封装:将一组数据和与这组数据有关的操作集合组装在一起,形成一个能动的实体,也就是对象。(意义:对象集中而完整的描述并应一个具体的事物,封装的信息隐蔽作用反映了事物的相对独立性;减少“波动效应”。副作用:增加了许多只负责读写的服务。)
继承:特殊类的对象拥有其一般类的对象的全部属性与服务,称作特殊类对一般类的继承。
多态:一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。(目前不要求OOPL支持)
C++语言的来龙去脉:对C语言进行面向对象的扩展。一种混合型OOPL。
C++不仅仅是在语法上对C的扩展,改变的是整个程序设计的方式和思路<很多情况下,我们会不知不觉的按照过程方式来解决它,因为我们通常习惯于考虑解决问题的方法,而不是考虑将要解决问题抽象为对象去解决它。>
一篇不错的文章:
<<我的面向对象程序观>>
在C语言中,可以用结构+函数来模拟类的实现,而用这种结构定义的变量就是对象。封装有两层含义,其一是隐藏内部行为,即隐藏内部函数,调用者只能看到对外提供的公共函数。其二是隐藏内部信息,即隐藏内部数据成员。现在都建议不要对外公开任何数据成员,即使外部需要知道的数据成员,也只能通过函数获取。
在C语言中要隐藏内部函数很简单:不要它把放在头文件中,在C文件中定义时,前面加static关键字,每个类放在独立的文件中。这样可以把函数的作用范围限于当前文件内,当前文件只有类本身的实现,即只有当前的类自己才能看到这些函数,这就达到了隐藏的目的。
在C语言中要隐藏数据成员较为麻烦,它没有提供像C++中所拥有的public/protected/friend/private类似的关键字。只能通过一些特殊方法模拟部分效果,我常用的方法有两种。
其一是利用C的特殊语法,在头文件中提前声明结构,在C文件才真正定义它。这样可以把结构的全部数据信息都隐藏起来。因为外部不知道对象所占内存的大小,所以不能静态的创建该类的对象,只能调用类提供的创建函数才能创建。这种方法的缺陷是不支持继承,因为子类中得不到任何关于父类的信息。
其二是把私有数据信息放在一个不透明的priv变量中。只有类的实现代码才知道priv的真正定义。
在C语言中实现继承很简单,可以用结构来模拟。这种实现基于一个明显的事实,结构在内存中的布局与结构的声明具有一致的顺序。我们知道在程序描述事物的特征时,主要通过数据变量描述事物的属性特征,如颜色、重量和体积等,用函数来描述事物的行为特征,和运动、成长和搏斗等。
继承在现实世界中应用很广,在程序里也是一样,甚至可以说是过度使用了。多年以前一些大师已经提出,优先使用组合而不是继承。主要原因有三点,首先是多级继承和多重继承太复杂了,失去了抽象带来的简洁性。其次是父类与子类之间共享太多信息,它们的耦合太紧密。
三是父类与子类之间的关系在编译时就静态绑定了,很难做到在运行时多态。
现在一般都提倡,只继承接口不继承实现,通过组合达到代码重用的目的。在《设计模式》中是这样强调的,在MS的COM里也是这样做的。
所以我基本上只使用接口继承,很少遇到什么麻烦,建议大家也遵循这一准则。
一个不错的C与面向对象的事例:http://blog.csdn.net/hbyufan/archive/2006/03/23/635962.aspx
阅读(1692) | 评论(0) | 转发(0) |