一言蔽之: 从四大特性可以看出,面向对象的终极目的只有一个:可维护性。易扩展、易复用,降低复杂度等等都属于可维护性的实现方式。

封装

封装变化点是面向对象中一种很重要的思维方式。

  • What

信息隐藏或数据访问保护。

  • How

类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或数据。它需要编程语言提供权限访问控制语法来支持,例如Java中的private、protected、public关键字。

  • Why

    • 保护数据不被随意修改,提高代码可维护性;
    • 仅暴露有限的必要接口,提高类的易用性。

      抽象

  • What

隐藏方法的具体实现,让使用者只关心功能,无需关心具体实现。

  • How

抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。

  • Why

    • 提高代码的可扩展性、维护性、修改实现不需要改变定义,减少代码的改动范围;
    • 处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。

      继承

  • What

用于表示类之间的 is-a 关系。

  • How

需要编程语言提供特殊语法机制。如Java的”extends”;C++的”:”等

  • Why

    • 作用:
      • 实现代码复用;
      • 反应了现实中 is-a 的关系,符合人类认知。
    • 缺点:
      • 过度使用继承会造成层次过深过复杂,导致父子类大量耦合,代码可读性、可维护性变差

        多态

  • What

将子类对象赋值给父类变量(或实现类对象赋值给接口变量)后,代码运行时,父变量执行的是子类对象的方法实现。

  • How

需要编程语言提供特殊的语法机制。如:继承、接口类、duck-typing

  • Why
    • 作用:
      • 提高代码的可扩展性和复用性;
      • 是很多设计模式、设计原则、编程技巧的代码实现基础。比如策略模式、基于接口而非实现编程、依赖倒置原则、里式替换原则、利用多态去掉冗长的if-else语句等等。
    • 注意:
      • 只有普通的方法调用可以是多态的,对象中的实例变量是不具备多态性的。

例如,如果你直接访问一个属性,该访问会在编译时解析;

  1. - 通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。