Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4043007
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类: C/C++

2007-01-09 17:55:31

使用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) |
给主人留下些什么吧!~~