封装也叫信息隐藏或者数据访问保护,也就是主要讲如何隐藏信息、保护数据。
类通过暴露有限的访问接口,授权外部仅能通过类提供的方法来访问内部信息或数据。
需要编程语言提供权限访问控制语法来支持,比如Java中的private、protected、public关键字。
抽象讲的是如何隐藏方法的具体实现,让调用者只需关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。
抽象可以通过接口类(如Java的interface关键字语法)或者抽象类(Java中的abstract关键字语法)这两种语法机制来实现。
Java中abstract class表示的是"is a"关系,interface表示的是"like a"关系。
继承用来表示类之间的is-a关系,分为两种模式:单继承和多继承。
单继承表示一个子类只能继承一个父类,多继承表示一个子类可以继承多个父类。
为了实现继承这个特性,编程语言需要提供特殊的语法机制来支持,如 Java 使用 extends 关键字来实现继承。
有些编程语言只支持单继承,不支持多重继承,比如 Java、PHP、C#、Ruby 等,而有些编程语言既支持单重继承,也支持多重继承,比如 C++、Python、Perl 等。
过度使用继承,继承层次过深过复杂,就会导致代码可读性、可维护性变差。
多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
多态这种特性也需要编程语言提供特殊的语法机制来实现,比如继承、接口类、duck-typing。
只要两个类具有相同的方法,就可以实现多态,并不要求两个类之间有任何关系,这就是所谓的 duck-typing,是一些动态语言(如Python)所特有的语法机制。
而像 Java 这样的静态语言,通过继承实现多态特性,必须要求两个类之间有继承关系,通过接口实现多态特性,类必须实现对应的接口。
多态可以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。