三个基本原则: 继承, 封装, 多态
五个基本原则: 单一职责原则, 开放封闭原则, 里氏替换原则, 依赖倒置原则, 接口隔离原则, 迪米特法则, 组合/聚合复用原则(五大是前五个, 七大在加上后面两个)
继承:
继承指的是建立一个新的派生类, 从一个或多个先定义的类中继承数据和函数, 可以重新定义或加进新的数据和函数, 从而建立了类层级或等级。继承指的是这样一种能力: 他可以使用现在类所有功能, 并在无需重新编写原来类的情况下对这些功能进行扩展。
创建新类成为: "子类"或"派生类"
被继承的类成为"基类"、"父类"、"超类"
继承的过程就是从一般到特殊的过程
在某些OOP(面向对象编程)语言中, 一个类可以继承多个基类, 但一般情况下, 一个类只有一个基类, 要实现多重继承, 可以通过多级继承实现。
继承概念实现的方式有三类: 实现继承、接口继承、可视继承
① 实现继承是指使用基类的属性和方法而无需额外编码的能力
② 接口继承是指仅使用属性和方法名称、但是子类必须提供实现代码能力
③ 可视化继承是指子窗口(类) 使用基窗口(类)的外观和代码实现功能
在使用继承时候留意, 两个类直接关系是属于关系。
在OC中,一个类继承另一个类,就是继承了父类所有的属性和方法,并且可以扩充自己的属性:而类别是在不改变原有类的基础上进行方法扩充。
例如: 动物分食草动物, 食肉动物, 食草动物分兔子, 羊, 牛, 食肉动物分老虎, 狮子。这里面兔子与食草动物就是一种继承关系
封装:
把客观的事物封装成抽象的类, 并且类可以把自己的数据和方法只让可信的类或者对象操作, 对不可信的类进行信息的隐藏。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
例如: 我们把兔子封装成一个类, 兔子属性两只耳朵, 四条腿, 一双眼睛, 三瓣嘴
多态:
同一个行为具有多个不同表现形式或形态的能力。一个实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态的优点:
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
多态存在的三个必要条件:
继承
重写(子类继承父类后对父类方法进行重新定义)
父类引用指向子类对象
简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观羊、参观狮子、参观老虎对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类。
--------------------------------------------------------------------------
单一职责原则(SRP)
一个类的功能要单一,不能包罗万象, 应该有且只有一个去改变它的理由, 一个类应该只有一项工作
比如在职员类里,将开发工程师、业务人员、分析师、售后人员等都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿。
开放封闭原则(OCP)
一个模块在扩展性方面应该是开放的而在修改性方面应该是封闭的。对象或实体应该对扩展开放,对修改封闭。
比如更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!
里氏替换原则(LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
依赖倒置原则(DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
可以这样理解,上面我举例子的时候先说了兔子和羊,然后才推出食草动物。但如果我们继续认识了牛、马等食草动物,我们会发现我们需要不断调整食草动物的描述,这样程序会变得僵化,所以我们不应该让子类依赖于实体,不应该让父类模块依赖于子类模块。所以我们需要将食草动物设计为抽象类,即抽象类或接口。这样下层只需要实现相应的细节而不会影响父类。
接口隔离原则(ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。
比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!
参考1: https://www.cnblogs.com/xiesong/p/10399273.html
参考2: https://www.cnblogs.com/fzz9/p/8973315.html#%E3%80%80%E3%80%803多态