亓莱滨 冯希叶 江海燕 杜 林
文章编号:1672-5913(2009)02-0085-02
摘要:比较教学法是教学中突破重点难点的有效方法。本文介绍了作者在Delphi多态性教学中运用比较教学法解析覆盖、重载和隐藏等难点概念的教学实践。
关键词:比较教学法;多态性;覆盖;重载;隐藏;Delphi
中图分类号:G642
文献标识码:A
1引言
多态性(Polymorphism)是面向对象程序设计(OOP)的三大支柱之一。在各种OOP语言的多态性教学中,覆盖、重载和隐藏等概念历来是教学难点。已有的教学实践证明,比较教学法是各学科教学中突破重点难点的有效方法 [1]。本文就Delphi多态性教学中运用比较教学法解析难点概念作概要讨论。
2多态性教学中的难点概念分析及解决方案
多态性教学中涉及的概念和术语较多,其中学生最感困难者当属覆盖、重载和隐藏。这些概念之所以成为教学难点,主要有以下原因:
(1) 概念本身的复杂性和表观相似性。
(2) 许多教科书对上述概念的解释混乱甚至误用。
(3) 教学中对上述概念先修知识准备不足。这些知识包括继承性、对象的声明类型与实际类型、向上转型(upcasting)、方法的绑定方式、基于绑定机制的方法分类等。
比较教学法的主要形式包括对比、类比、横比和纵比等,笔者在教学中主要采用对比法对上述难点概念进行解析。对比法是揭示比较对象形同质异的思维方法,在对比中发现个性。由于比较对象外部特征相同或相似,往往对人造成直接的迷惑性,容易使人产生主观臆断或机械式认同[1]。易混事物的比较是对比法的重点内容,析其同(似),找出它们容易被混淆的原因;求其异,通过特征对比挖掘事物的本质属性[2]。
3覆盖与重载的比较
覆盖(Override)与重载(Overload)是两个完全不同的概念。这是初学者最容易混淆的两个概念,也是许多教科书和文献中使用比较混乱甚至误用的概念。
重载(Overload)的原意是指在同一范围内可以使用同一名称声明多个过程或函数,它们含有不同的参数列表(同名异参)。与Java和C++等语言不同,Delphi提供了专门的指令字overload用于重载。方法的本质是在类中声明的过程或函数,因此也可以重载。Delphi的方法重载不限于在本类内声明的方法,在派生类中亦可用overload指令字声明与基类中同名的方法。
覆盖(Override)一个方法意味着在派生类中对基类方法进行扩展或改进,相当于“推翻”了基类方法的原有定义(实现部分),而采用派生类自己的方法定义。通过覆盖可以使一个方法在不同派生类之间表现出不同的行为,从而实现多态。覆盖一个方法时并未生成新的方法,只是修改了基类方法的原有定义[3,4]。
覆盖与重载容易被混淆的原因:二者英文拼写相似;教科书中译名和解释混乱;它们均涉及基类和派生类中的同名方法;均可使同名方法表现出不同行为。
以上述原因分析为基础,在教学中通过特征对比,揭示二者的本质区别(见表1)。
从表1可以看出,在Delphi中,覆盖和重载分别使用专门的指令字(这一点与C++和Java不同),并且具有不同的参数规则,通过这两个外显特征不难将二者区分开来。然而,初学者常感困惑的问题不在于此,而是它们的内隐特征,后者并未直观地显现在代码中。这些内隐特征属于系统的内部机制,其中最重要的是绑定方式,它决定了多态性的实现机制。笔者在教学中分别设计了代码相似但本质不同的示例程序,让学生分析代码并观察运行结果,通过对比找出它们的内隐特征,进而掌握覆盖和重载的本质区别及其用途。
4覆盖与隐藏的比较
隐藏(Hide)机制与传统编程中局部变量对同名全局变量的遮蔽(Shadowing)效应很相像。在Delphi中,如果在派生类中声明的方法与基类中的方法名称相同,并且未使用特殊指令字,则系统将启动隐藏机制[3,4],即隐藏从基类继承的同名方法,并用派生类中新声明的方法代替它。在其他语言中也存在隐藏机制[5,6],只是实现的细节略有差异。例如,C#中的new关键字不仅可用于为变量(指针)分配内存,还可以在派生类的方法声明中使用,以实现隐藏机制[6]。
覆盖与隐藏容易被混淆的原因如下:教科书中涉及甚少或解释混乱;它们均涉及基类和派生类中的同名方法;均可作用于虚方法和动态方法。
在Delphi中,方法覆盖必须使用指令字override,它是区分覆盖和隐藏的重要标志,这一点与C#相同[6]。如果在派生类中声明的方法与基类的虚方法或动态方法同名同参,但不含override指令字,则新的声明只是隐藏继承的方法而不覆盖它。在派生类中,方法名是静态(早期)绑定的,方法的调用取决于对象变量的声明类型而不是实际类型,其效果类似于静态方法的重新声明。教学中通过对覆盖和隐藏的对比,可以引导学生透过现象认识其本质,消除认识误区(见表2)。
5重载与隐藏的比较
Delphi中的方法重载必须遵守两个基本规则:①使用overload指令字;②方法同名异参;二者缺一不可。这是区分重载与隐藏的主要标志。
如果在派生类中声明了与基类中同名异参的方法,但未使用overload指令字,则继承于基类的同名方法将被隐藏;此时声明类型为派生类的对象已不能直接调用继承的基类同名方法,无法实现重载。
如果使用了overload指令字,而派生类与基类中的方法同名同参,尽管编译时仍可通过,但这样做没有意义,实际效果与方法的隐藏相同。此时声明类型为派生类的对象仍然不能直接调用继承于基类的同名方法,并未实现真正意义上的重载。
重载与隐藏容易被混淆的原因如下:二者均涉及基类和派生类中的同名异参方法;它们均可作用于静态方法、虚方法和动态方法;均采用早期绑定;用于虚方法和动态方法时均使用附加指令字reintroduce,以避开编译器警告。
由于二者相似点较多,因此笔者在教学中运用对比法在形似中求质异,强调其本质区别(见表3)。
6结束语
覆盖、重载和隐藏是多态性教学中的重点和难点概念,笔者在教学过程中不仅将比较教学法应用于这些概念的理论辨析,而且配以形似质异的典型示例程序强化比较教学法的实施效果。因篇幅所限,未将程序示例纳入本文。尽管比较教学法的适用范围较广,但要注意避免滥用,应当根据教学目标的要求,遵循3W原则:明确比较的目的(Why),选准适于比较的内容(What),采用恰当的比较方式(How);如此方可充分发挥比较教学法的优势,收到事半功倍之效。
参考文献
[1] 赵晓东. 比较教学法与工程机械教学[J]. 中国职业技术教育,2006,(19): 47-48.
[2] 李运模. 比较教学法论略[J]. 中南民族学院学报(人文社会科学版),2000,20(3):125-127.
[3] Marco Cantù. Mastering Borland Delphi 2005[M]. USA: SYBEX Inc., 2005.
[4] 刘艺. Delphi面向对象编程思想[M]. 北京:机械工业出版社,2003.
[5] Bruce Eckel. Thinking in C++, 2nd Ed., Volume 1[M]. USA: Prentice Hall PTR, 2000.
[6] Andrew Troelsen. Pro C# 2008 and the .NET 3.5 Platform, 4th Ed[M]. USA: Apress, 2007.
Application of Comparative Teaching Method in Difficult Concepts Teaching of Polymorphism in Delphi
QI Lai-bin, FENG Xi-ye, JIANG Hai-yan, DU Lin
(Dept. of Computer Science and Technology, Shandong Institute of Education, Jinan 250013, China)
Abstract:Comparative teaching method is the effective method to surmount emphases and difficulties in teaching. This paper introduced the teaching practice of authors utilizing comparative teaching method to resolve difficult concepts that include override, overload and hide.
Key word:comparative teaching method; polymorphism; override; overload; hide; Delphi