说是读后感,根本算不上,当记个笔记,划个重点吧。

Reference

Demo

照着意思写了个小 Demo,至于理解对不对,以及能不能看懂,就看各位造化了。

多态

本质是子类通过覆盖或重载父类方法,来使得对同一类对象(继承层级再上一层的对象)同一方法的调用产生不同的结果。

4 种常见情况

父类有部分 public 的方法是不需要,也不允许子类覆盖

缺点:使得一个对象引入了原本不属于它的业务逻辑

父类有一些特备的方法是必须要子类去覆盖的,在父类的方法其实是一个空方法

缺点:代码不好看,有可能忘记覆重

父类有一些方法是可选覆盖的,一旦重覆,则以子类为准

缺点:容易使得一个对象引入原本不属于它的业务逻辑

父类的一些方法即使被覆重盖了,父类原方法还是要执行的

缺点:父类方法是放在覆重函数的第一句还是最后一句调用,或忘记调用,傻傻分不清楚

解决方案

面向接口编程(Interface Oriented Programming, IOP)

  1. 将子类与可能被子类引入的不相关逻辑剥离开来,提高了子类的可重用性,降低了迁移时可能的耦合
  2. 接口实际上是子类头上的金箍,规范了子类那些必须实现,那些可选实现
  3. 那些不在接口定义列表里的父类方法,事实上是不建议覆重的方法

使用多态 2 要素

  1. 如果引入多态之后导致对象角色不够单纯,那就不应当引入多态,如果引入多态之后依旧是单纯角色,那就可以引入多态
  2. 如果要覆重的方法是角色业务的其中一个组成部分,例如 split() 和 resort(),那么就最好不要用多态的方案,用 IOP,因为在外界调用的时候其实并不需要通过多态来满足定制化的需求

如果是只要子类通过覆重提供中间数据的,一律应当采用IOP而不是多态。