面向对象三大基本特性

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础.


三大特性是:封装,继承,多态  

【封装】

所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

良好的封装能够减少耦合(每个对象都包含它能进行操作的所有信息,因此对象不必依赖其他对象完成自己的操作),类内部的实现可以自由修改,对外只需要提供清晰的接口

【继承】
所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

对象的继承代表了一种‘is-a’的关系,如果有两个对象A和B可以描述为‘B是A’,则表明B可以继承A;继承者还可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自己独特的个性,例如猫和狗都是动物,那么猫和狗与动物是继承关系,猫和狗都是动物的特殊化

学习继承最好是记住三句话:

第一、子类拥有父类非private的属性和方法

第二、子类具有自己的属性和功能(方法),即子类可以扩展父类没有的属性和功能

第三、子类还可以以自己的方式实现父类的功能(方法重写)

继承的优点是:继承使得所有子类公共的部分都放在了父类,使得代码得到共享避免重复;另外继承可使得修改或扩展继承而来的实现都较为容易

继续的缺点是:父类变则子类不得不变;继承会破坏包装,父类实现细节暴露给子类,增大了两个类之间的耦合性

【多态】 

所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。

多态表示不同的对象可以执行相同的动作(方法),但要通过他们自己的实现代码来执行。举个例子,国粹‘京剧’都是子承父业(继承),假设有一天父亲生病上不了台表演,由于京戏都是化妆之后才可以上台,于是儿子就可以代替父亲上台表演。这个例子关键点是:第一、子类必须以父类的身份出现(儿子代表父亲表演,化妆之后就是父亲的身份了);第二、子类在工作时以自己的方式来实现(方法重写)。儿子模仿再好也只能自己理解的表现方式去模仿父亲的作品;第三、子类以父类的身份出现时,子类特有的属性和方法不可以使用。尽管儿子有自己的绝活,但是在以父亲的身份表演时是不能表现出来的。当然如果父亲还有别的儿子会表演,也可以代替父亲上场,这就是多态。

多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于继承链最末端的方法实现被调用,也就是虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。

五大基本原则 
单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

开放封闭原则OCP(Open-Close Principle) 
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

替换原则(the Liskov Substitution Principle LSP) 
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

依赖原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,
这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

接口分离原则(the Interface Segregation Principle ISP) 
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

猜你喜欢

转载自www.cnblogs.com/juicy/p/7521590.html