《TypeScript图形渲染实战:2D架构设计与实现》 —3.3.3 多态(虚函数动态绑定)
3.3.3 多态(虚函数动态绑定)
此时来了解面向对象三要素中的多态行为是一个好的时机点。下面来看一下ApplicationTest是如何创建和调用的。代码在上一节中,为了更好地了解,此处复制具体代码如下:
let app : Application = new ApplicationTest ( canvas ) ;
// 手动调用update 和 render成员方法
app . update ( 0 , 0 ) ;
app . render ( ) ;
要关注的一个事实是,变量app声明的类型是Application基类,而不是ApplicationTest子类,但是new的时候却是ApplicationTest子类。
调用上述代码后,根据图3.12的结果,会发现调用update和render后在console控制台中输出了相关信息。而Application基类实现中,update和render都是空实现。
当用app调用update方法和render方法时,就会发生多态行为,也就是运行时函数地址动态绑定。此时会发现,虽然使用基类来调用update和render方法,但是程序却自动调用了ApplicationTest覆写(override)的update和render方法。这就是多态,基类自动调用子类的同名虚方法。当然,笔者是以C++的方式来理解TypeScript的面向对象相关内容,但是从原理上是说得通的。
多态这种行为特别适合面向接口和面向抽象编程。例如在Application的step中会调用update和render方法,这个流程很固定,子类不会修改。而update和render由于不同的子类有不同操作,因此作为虚函数由子类自己来决定如何实现。
当设计框架时,这是一种常用的方法,将不变的部分封装在基类,将可变部分以虚函数(使用多态)或回调函数方式公开给用户自己实现。
事实上,上述的行为从设计模式角度来说,就是经典的模板方法设计模式,在Application基类中设计好了一个模板流程,并定义好update和render这两个模板虚方法,规定好这两个方法的调用流程,子类则负责具体实现update和render方法。
下面总结以下知识点:
* 如果一门编程语言支持类,那么可以认为该语言是一门基于对象的语言。
* 如果一门编程语言支持类继承的同时还支持多态,那么该语言是一门面向对象的语言。
* 面向对象三要素是:继承、封装和多态。
* 多态就是使用基类来调用实现类(派生类)的虚方法(TypeScript中,类的成员方法都是虚方法)。
- 点赞
- 收藏
- 关注作者
评论(0)