封装、继承、抽象、多态分别可以解决那些问题?
面向对象的四大特性,对于他们的定义很熟悉,但是他们解决了哪些问题?
封装
封装---信息隐藏,数据保护
外部仅能通过类提供的方式,访问内部的信息或者数据,对于java来说,是属性字段私有化,访问函数公有,甚至部分属性字段没有的一种结构形式。
解决的问题
- 可控:信息或数据只能通过部分暴露的方法访问,限制了灵活性,但是修改的逻辑、业务的实现,都处于可控状态下,可维护性
- 隐藏:使用者不需要具体的实现方式,实现的细节,简化了操作,降低了犯错的概率,可易用性
抽象
封装是对信息和数据的隐藏,而抽象就是对实现方法的隐藏,践行的是基于接口为非实现、开闭原则、代码解耦的思想。对于java来说是接口类、抽象类,还可以包括函数,因为函数本身就是对实现方法的封装,使用者只需要了解能够做什么,对于实现的细节不需要具体的掌握。
因为抽象的思想不止在面向对象编程中存在,可以说是一个普遍的方法,所以有时候也不把它看作是一个面向对象的特性
意义
- 简化:只需要关注功能而不需要了解细节,是对易理解、易拓展的践行
继承
简单的说---is a
好处就是代码复用、符合直觉关系,在java中是extends的单继承。坏处是继承层次太深、太复杂时,可读性(需要查看父类方法)、可维护性(父类修改子类也产生修改)差。
多用聚合少用继承?
多态
父类引用指向子类实现---子类可以替换父类
实现方式:
- 继承和重写---有继承关系
- 接口的实现---实现了接口
- duck-typing---只需要具有相同的方法,python等动态语言的特性
解决的问题:
- 可拓展、可复用性:只需要一个使用逻辑,就能实现种方式的操作