多态机制

背景

本文为《冒号课堂:编程范式与OOP思想》一书中第十课的思考与总结。

问题与解答

多态类型在何种程度上解放了静态类型的束缚?

静态类型语言中的多态是动静结合的产物,将静态类型的安全性和动态类型的灵活性融为一体。它一般有两种实现方式:一种利用GP(泛型编程)中的参数多态,一种利用OOP中的包含多态或称子类型多态。

请总结参数多态与子类型多态的特点和适用场合。

  1. 从实现机制上看,二者的不同之处在于何时将一个变量与其实际类型所定义的行为挂钩。前者在编译期,属于早绑定或静态绑定;后者在运行期,属于迟绑定或动态绑定。
  2. 从应用形式上看,前者是发散式的,让相同的代码应用于不同的场合;后者是收敛式的,让不同的实现代码应用于相同的场合。
  3. 从思维方式上看,前者是泛型式编程风格,看重的是算法的普适性;后者是对象式编程风格,看重的是接口与实现的分离度。

为什么抽象类型如此重要?

抽象是个相对概念,一个类型是否是抽象的完全取决于设计者对它的角色定位。如果想用它来创建对象,它就是可实例化的具体类型;如果想用它来作为其他类型的基类,它就是不可实例化的抽象类型。

具体类型是创建对象的模板,抽象类型是创建类型的模块。一个是为对象服务的,一个是为类型服务的。

抽象数据类型的核心是数据抽象,而抽象类型的核心是多态抽象。

区分接口与抽象类?

语法区别:接口不能提供实现但能多重继承,抽象类则正相反;接口只能包含共有的、非静态的、抽象的方法成员,抽象类则无此限制。

语义区别:接口是一套功能规范集合,相同的接口代表相同的功能,多表示“can-do”关系,一般是对象的边缘特征,在本质不同的类型之间建立横向联系;抽象类是一类对象的本质属性的抽象,相同的抽象基类代表相同的种类,多表示“is-a”关系,一般是对象的核心的特征,在本质相同的类型之间建立纵向联系。接口看重规范重用和可置换性;抽象类看重代码重用和可扩展性。