友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第10章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




阐述其具体含义。  


…………………………………………………………Page 40……………………………………………………………

2。1。2 封装  



按照面向对象编程原定义,所谓的封装性是指隐藏类 (class)为支持 

和实施抽象所作的内部工作的过程。类的接口是公有的,它定义了一 

个类所能完成的功能,而这些接口的实现是私有的或受保护的,它定 

义了类完成这些功能所作的具体操作。对于使用这些类的编程者来 

说,只需要知道类所能完成的功能,而不需要知道这些功能具体是如 

何实现。拿我们所常的手表作为例子,在使用手表时,我们只需要知 

道手表所能完成的功能和如何使用手表来完成这些功能,这些内容相 

当于对象的接口。我们不需要知道在手表的内部,这些功能是如何实 

现的,因此,对于手表来说,无论手表使用的是一般的机械摆,还是 

石英振荡器,只要它们的使用方法是完全一样的,用户就没有必要知 

道这个不同。另一个例子的集成电路芯片,我们只需要知道该芯片的 

每一个引脚的电气参数和功能,而不必知道这些功能在芯片的内部是 

如何实现的,就可以使用该芯片来组装电路。如果仅就封装性而言, 

这里的手表和集成电路芯片就相当于面向对象的编程中的对象。下面 

我们再举一个例子,众所周知,Win32操作平台目前包括Windows   95 

和Windows NT,而事实上,Windows 95和Windows NT使用了完全不同 

的内核,对于很多同样的操作,在Windows 95和Windows NT两个操作 

系统下的实现方式是不同,但两个操作系统都提供了同样的Win32应 

用程序编程接口 (API),这样,我们所编写的应用程序只需要和Win32 

应用程序编程接口打交道,而没有必要知道具体的每一个Win32   API 

函数在操作系统中是如何实现的。换一种说法就是,Windows       95和 

Windows NT封装了Win32 API函数的具体实现。  



一个类在定义数据的同时也定义了对这些数据的操作,这些操作称作 

方法 (method)。按照面向对象的定义,方法就是对对象中的数据的访 

问。在C++中,对对象中的数据的访问是通过公有成员函数来进行 

的,这些公有成员函数可以在对象的外部进行调用,它们提供了对象 

的外部接口。而对于这些接口的内部的实现在对象的外部的不可见 

的,这些实现包括了类内部所使用的数据结构和支持公有方法的实现 

的私有成员函数,通常,这些数据成员和成员函数是私有的,它们只 

能为类中成员函数所访问,而不能从类的外部进行访问。  



访问一个方法的过程称为向这个对象发送一个消息 (message),对象 

的工作是靠消息来激发的,对象之间也是通过消息发生联系的,即请 

求其它对象做什么或响应其它对象的请求是通过发送或接收消息来实 

现的。  



  l 注意:  


…………………………………………………………Page 41……………………………………………………………

  l 这里的所说消息和在Windows编程中所常说的消息是两个不同术 

   语,尽管在某些方面两者的确有很多相象之处。  



封装可避免许多维护性问题。如果一个基本数据类型的结构被修改 

了,例如一个链表修改成了一个数组,除类中的访问该数据的方法的 

代码外,软件系统的其余部分是不受影响的,因为基本数据在外部是 

不可见的,只能通过公有方法的接口与基本数据发生联系,改变一个 

类的实现,丝毫不影响使用这个类的程序员,从而大大的减少了应用 

程序出错的可能性。  



                                          



               图2。1  自然世界中的继承关系  



2。1。3 继承  



类支持层次机制,因此我们可以借用可重用性部件来很容易的从一个 

或多个已有类出发,来生产各种更符合我们要求的新类。假设我们从 

类A出发来派生新的类B,那么我们称类A为类B的基类 (base  class), 

类B为类A的派生类 (derived   class),类B继承了类A中的各种行为和 

状态,并可添加自己的成员变量和成员函数。  



我们先来看一个例子,图2。1给出了自然世界中的生物的一种继承层 

次图,最高层次的生物类代表了层次结构中最一般的概念,较低层次 

的类表示由上一层的类 (即其基类)所派生的特殊的概念。如上面的继 

承关系,动物类从其基类—生物类中继承生物类的所有属性和行为, 

并且定义了动物类所特有的属性和行为,类似的,脊椎动物类从动物 

类那儿继承了所有的属性和行为,并且定义了自身特有的属性和行 


…………………………………………………………Page 42……………………………………………………………

为;……,人类从灵长动物类那儿继承了所有的属性和行为,并且定 

义了人类所特有的属性和行为。  



之所以举上面的例子是为了将程序空间和现实生活空间来进行对比, 

结果说明一点,类的继承使得我们可以以一种自然的方式来模拟生活 

空间中的对象的层次结构,也就是说,我们可以以一种符合正常思维 

逻辑的自然的方式来思考和组织应用程序的结构,然后,可以将这个 

结构几乎不作修改或者只需作少量的修改地用面向对象的编程来表 

达,从而大大的缩短了软件系统的开发周期。  



下面我们举一个现实编程中的例子,考虑MFC                (Microsoft  

Foundation  Class  Library,Microsoft基础类库)中的CEdit类,它 

封装了Windows中的编辑框控件,图2。2显示了CEdit类的继承结构。  



                               



              图2。2 类CEdit在MFC中的继承层次  



在图2。2中,类CObject是所有的MFC类的根(根是一个术语,它指在继 

承层次中处于最顶层的类,根是所有继承层次中的类的最终基类), 

在类CObject中提供了功能有:串行化支持、运行库信息、对象诊断 

输出以及与集合类的兼容等。类CCmdTarget从类CObject直接派生, 

它是Microsoft基础类库的消息映射结构的基类,消息映射将命令和 

消息传递给所编写的处理成员函数,这里,命令指来自菜单项、命令 

按钮和加速键的消息。类CWnd提供了MFC中所有窗口类的基本功能 

性,它封装了Windows中的窗口句柄hWnd。类CEdit从CWnd直接派生, 

它提供了对Windows编辑控件的特定支持。  



我们看到,类CEdit本身仅提供了特定于编辑控件的38个成员函数, 

但是,你可以通过类CEdit进行调用的成员函数却多达300多个,事实 

上,这些成员函数中的绝大部分由其基类所提供,其中CWnd就为 

CEdit提供了多达304个成员函数,由于CEdit类继承了其基类的数据 

和方法,因此,可以通过CEdit类调用CWnd类中提供的方法来实现对 

标准Windows窗口的操作。  



继承机制所带来的最大优势在于使软件系统非常的易于扩充,程序员 


…………………………………………………………Page 43……………………………………………………………

不仅可以直接的使用各种已有的类,还可以从这些类方便的派生出新 

的类,新的类继承了基类所包括的所有接口和功能,因此只需要定义 

和实现与基类所提供的功能中不同的那一部分,这大大的降低了软件 

开发的复杂性和费用,因此面向对象的编程方式非常之适合于进行大 

型软件系统的开发。  



降低软件开发的复杂性的意义不仅在于它可以有效的降低软件开发的 

费用,而且还使得在软件系统中出错的可能性大为减少。由于类有着 

清晰的继承层次,因此,我们可以很快的定义出错的代码所处的位 

置,因此能够很快的修正程序中出现的问题。  



继承机制还使得我们可以将与现实生活空间相一致的思维方式应用于 

程序空间,即我们可以在程序设计时使用直观的思维方式设计程序中 

所使用的对象的层次结构,然后,直接将此结构映射到面向对象的程 

序空间,而不需要做任何修改或仅需要作少�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!