《TypeScript图形渲染实战:2D架构设计与实现》 —3.3.3 多态(虚函数动态绑定)

举报
华章计算机 发表于 2019/12/12 19:29:48 2019/12/12
【摘要】 本节书摘来自华章计算机《TypeScript图形渲染实战:2D架构设计与实现》 一书中第3章,第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中,类的成员方法都是虚方法)。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。