首页 > 技术文章 > 面向对象三大特性-------封装

Coffuture 2018-04-16 21:17 原文

Coffuture 2018-4-16

概念引导:

什么是封装

官方解释:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

一句话总结:封装就是把数据和具体操作包围起来,对数据的访问只能通过已定义的接口。

详细解释:封装从形式上来说,它将数据和操作界定在了某个圈子内,如果外界想要访问数据,或者使用某个操作,必须通过特殊的手段向这个圈子申请。这个圈子便是类,特殊的手段就是接口。即假如外界想要访问类中的数据或者使用类中某个方法的具体操作,必须通过这个类事先提供的接口来访问,这个接口一般就是方法名。

一开始学封装时产生的疑惑是为什么要将数据和操作封装起来,然后想要使用的时候再通过接口访问,这不是很麻烦吗?是的,确实很麻烦。但麻烦归麻烦,它带来的好处是这小小的麻烦无法所抵抗的。

理解分析:

为什么要封装,它有什么好处?

  • 封装提高了代码的复用性和可维护性。

封装为编程的模块化提供了基础,封装好的每一个类相当于就是一个小的模块。而模块化的好处就是分工明确外加可以重复利用(比如一个类实现一个小功能,当某些地方需要用到这个功能的时候,就可以很方便地调用它,不同自己花大代价去实现,另外分工明确的好处就是当某一个功能出了问题时,仅需要修改它自身就好,对其他的功能并不造成影响)。

  • 封装提高了编程的安全性和灵活性。

封装的核心在于面向接口(这里的接口指的是方法名),什么叫做面向接口呢?即对于类的编写者和类的使用者来说,唯一不变的东西便是接口,接口是两方的中介。接口让类的实现者可以根据需求动态地修改封装内的东西却不影响外部的调用者,同时接口也让外部调用者清楚地认识到这个类哪些部分是对自己开放的,哪些地方不可以碰。

  • 封装简化了编程。

因为封装的缘故,将会有大量事先被编好的具备各种功能的类,这些类组成了一个十分丰富的类库。当我们在编程的时候,需要实现某个功能的时候,可以选择从类库中找找,有没有符合自己需求的类,而不是绞尽脑汁去想办法从零去实现一个具体功能。

强化记忆:

该怎么结合实际去理解记忆这个概念呢?

举个例子来帮助大家更好地理解封什么是封装以及它带来的好处。假如你现在想要DIY一台电脑,如果没有封装意味着什么呢?这意味着你在市面上只能买到一整台生产商帮你完整设计生产好的电脑。假如你非想要自己捣鼓出一台DIY的电脑的话,只能从零开始造一台电脑(嗯这好像玩大了)。
但假如有了封装,现状就完全不是这个样子了,有了封装意味着一台电脑是由一个个大的模块构成的,每个模块就是一个封装,对应现实中就是一个电脑部件(比如cpu、内存、显卡等等),这些部件各自提供不同的功能,在为一台电脑共同提供服务的同时又彼此之间相对地独立工作着。在这样的大背景下,你想DIY一台电脑就显得容易很多,你只需要去市面上调查清楚哪些部件符合你的要求,然后将它们都买来。(这里对应具体编程就是你想要实现一个相对复杂的功能,在这个情况下,你引入了了很多类库中的已经被实现的,从功能上来说较为简单的类)
当你把所以的零件都买了回来,这时候你又遇到了新的问题,我该怎么使用这些零件呢?这个时候就要体现封装当中所提供接口的用处了。类的调用者只需要遵守接口的正确使用方式,便可以轻松地使用类所提供的具体操作。回到现实当中就是你只要把买回来的零件根据说明书,正确地接在对应的卡槽或者连接口上,就能保证这些零件能正常地提供服务。在这个过程中,接口更像是一种契约,只要这个零件提供这个接口,那么就能保证它能够作为电脑整体的一部分,提供服务。回到类当中就是只要这个类定义并提供了接口(实际就是方法名),那么类的调用者就能通过方法名来正常地使用方法中的具体操作。
除了以上提的这些好处和优点外,在现实中我们还经常碰到的场景就是某一天我们因为自身需求想要升级某一个部件或者因为损坏而不得不替换某个部件。这个时候我们仅需到市面上买一个符合我们需求的零件替换上便可以。这些也是封装以及面向接口所带来的好处,封装让模块化成为现实,面向接口降低模块间的耦合性,提高了整个系统的灵活性和可维护性。(囧..明明是讲封装的谈着谈着就谈到了接口.....毕竟类中提供的接口并不是真正的接口...只是在功能性质上有些接近)

引申思考:

封装作为面向对象的三大特性之一,它与其他两大特性有何联系
抽象与封装的关系
接口与封装的关系

参考链接

推荐阅读