面向对象的三大特征、五大基本原则

本文修改转载于 链接

一、三大基本特征(封装、继承、多态)

1、封装

封装是指属性和方法的定义都封装在类定义中,然后通过对其可见性来控制外部对类成员对可访问性。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
在面向对象中,我们可以将对象进行封装(像自己,人是我们的封装类,我们只是人这个对象的一个实例)

2、继承

继承是以原有的类为基础来创建一个新的子类,子类继承父类的所有特性,并可以扩充自己的特性,从而构造出更为复杂的类型。
比如兔子这个对象,它的属性有两只耳朵、四只腿、等;行为(功能)有跑、跳、吃素等,其他动物也一样可以进行封装。
在封装过程中我们发现兔子、绵羊这两个类具有相似的功能或特性如吃草,所以我们可以抽取共有特征和方法形成高一层的类,如这里的食草动物、食肉动物。继承之间是子父类的关系。继承机制可以很好的描述一个类的生态,也提高了代码复用率,在Java中的Object类是所有类的超类,常称作上帝类。

继承有直接继承间接继承,单继承多继承

直接继承: 类a继承于类b 则称a直接继承于b
间接继承: 类a继承于类b,类b继承于类c,则称a间接继承于c
单继承: 一个类只有一个父类(java中extends关键字实现了单继承机制)
多继承: 一个类有两个及两个以上的分类 (java只支持单继承不直接支持多继承)

3、多态

多态: 多态是指程序中出现的方法或变量"重名"现象
是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态存在的三个必要条件:

1)继承
2)重写(子类继承父类后对父类方法进行重新定义)
3)父类引用指向子类对象

简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观绵羊、参观狮子、参观豹子都是对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类

二、五大基本原则

1、单一职责原则(SRP)

一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。

比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿。

2、开放封闭原则(OCP)

对象或实体应该对扩展开放,对修改封闭。

更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!

3、里氏替换原则(LSP)

在对象 x 为类型 T 时 q(x) 成立,那么当 S 是 T 的子类时,对象 y 为类型 S 时 q(y) 也应成立。(即对父类的调用同样适用于子类)

4、依赖倒置原则(DIP)

高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。

可以这样理解,上面我举例子的时候先说了兔子和绵羊,然后才推出食草动物。但如果我们继续认识了牛、马等食草动物,我们会发现我们需要不断调整食草动物的描述,这样程序会变得僵化,所以我们不应该让子类依赖于实体,不应该让父类模块依赖于子类模块。所以我们需要将食草动物设计为抽象类,即抽象类或接口。这样下层只需要实现相应的细节而不会影响父类。

5、接口隔离原则(ISP)

不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!

比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!

这些基本原则需要我们在使用面向对象编程中慢慢领会、总结。

猜你喜欢

转载自blog.csdn.net/qq_42878218/article/details/106364990