亓萊濱 馮希葉 江海燕 杜 林
文章編號(hào):1672-5913(2009)02-0085-02
摘要:比較教學(xué)法是教學(xué)中突破重點(diǎn)難點(diǎn)的有效方法。本文介紹了作者在Delphi多態(tài)性教學(xué)中運(yùn)用比較教學(xué)法解析覆蓋、重載和隱藏等難點(diǎn)概念的教學(xué)實(shí)踐。
關(guān)鍵詞:比較教學(xué)法;多態(tài)性;覆蓋;重載;隱藏;Delphi
中圖分類號(hào):G642
文獻(xiàn)標(biāo)識(shí)碼:A
1引言
多態(tài)性(Polymorphism)是面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)的三大支柱之一。在各種OOP語言的多態(tài)性教學(xué)中,覆蓋、重載和隱藏等概念歷來是教學(xué)難點(diǎn)。已有的教學(xué)實(shí)踐證明,比較教學(xué)法是各學(xué)科教學(xué)中突破重點(diǎn)難點(diǎn)的有效方法 [1]。本文就Delphi多態(tài)性教學(xué)中運(yùn)用比較教學(xué)法解析難點(diǎn)概念作概要討論。
2多態(tài)性教學(xué)中的難點(diǎn)概念分析及解決方案
多態(tài)性教學(xué)中涉及的概念和術(shù)語較多,其中學(xué)生最感困難者當(dāng)屬覆蓋、重載和隱藏。這些概念之所以成為教學(xué)難點(diǎn),主要有以下原因:
(1) 概念本身的復(fù)雜性和表觀相似性。
(2) 許多教科書對上述概念的解釋混亂甚至誤用。
(3) 教學(xué)中對上述概念先修知識(shí)準(zhǔn)備不足。這些知識(shí)包括繼承性、對象的聲明類型與實(shí)際類型、向上轉(zhuǎn)型(upcasting)、方法的綁定方式、基于綁定機(jī)制的方法分類等。
比較教學(xué)法的主要形式包括對比、類比、橫比和縱比等,筆者在教學(xué)中主要采用對比法對上述難點(diǎn)概念進(jìn)行解析。對比法是揭示比較對象形同質(zhì)異的思維方法,在對比中發(fā)現(xiàn)個(gè)性。由于比較對象外部特征相同或相似,往往對人造成直接的迷惑性,容易使人產(chǎn)生主觀臆斷或機(jī)械式認(rèn)同[1]。易混事物的比較是對比法的重點(diǎn)內(nèi)容,析其同(似),找出它們?nèi)菀妆换煜脑?;求其異,通過特征對比挖掘事物的本質(zhì)屬性[2]。
3覆蓋與重載的比較
覆蓋(Override)與重載(Overload)是兩個(gè)完全不同的概念。這是初學(xué)者最容易混淆的兩個(gè)概念,也是許多教科書和文獻(xiàn)中使用比較混亂甚至誤用的概念。
重載(Overload)的原意是指在同一范圍內(nèi)可以使用同一名稱聲明多個(gè)過程或函數(shù),它們含有不同的參數(shù)列表(同名異參)。與Java和C++等語言不同,Delphi提供了專門的指令字overload用于重載。方法的本質(zhì)是在類中聲明的過程或函數(shù),因此也可以重載。Delphi的方法重載不限于在本類內(nèi)聲明的方法,在派生類中亦可用overload指令字聲明與基類中同名的方法。
覆蓋(Override)一個(gè)方法意味著在派生類中對基類方法進(jìn)行擴(kuò)展或改進(jìn),相當(dāng)于“推翻”了基類方法的原有定義(實(shí)現(xiàn)部分),而采用派生類自己的方法定義。通過覆蓋可以使一個(gè)方法在不同派生類之間表現(xiàn)出不同的行為,從而實(shí)現(xiàn)多態(tài)。覆蓋一個(gè)方法時(shí)并未生成新的方法,只是修改了基類方法的原有定義[3,4]。
覆蓋與重載容易被混淆的原因:二者英文拼寫相似;教科書中譯名和解釋混亂;它們均涉及基類和派生類中的同名方法;均可使同名方法表現(xiàn)出不同行為。
以上述原因分析為基礎(chǔ),在教學(xué)中通過特征對比,揭示二者的本質(zhì)區(qū)別(見表1)。
從表1可以看出,在Delphi中,覆蓋和重載分別使用專門的指令字(這一點(diǎn)與C++和Java不同),并且具有不同的參數(shù)規(guī)則,通過這兩個(gè)外顯特征不難將二者區(qū)分開來。然而,初學(xué)者常感困惑的問題不在于此,而是它們的內(nèi)隱特征,后者并未直觀地顯現(xiàn)在代碼中。這些內(nèi)隱特征屬于系統(tǒng)的內(nèi)部機(jī)制,其中最重要的是綁定方式,它決定了多態(tài)性的實(shí)現(xiàn)機(jī)制。筆者在教學(xué)中分別設(shè)計(jì)了代碼相似但本質(zhì)不同的示例程序,讓學(xué)生分析代碼并觀察運(yùn)行結(jié)果,通過對比找出它們的內(nèi)隱特征,進(jìn)而掌握覆蓋和重載的本質(zhì)區(qū)別及其用途。
4覆蓋與隱藏的比較
隱藏(Hide)機(jī)制與傳統(tǒng)編程中局部變量對同名全局變量的遮蔽(Shadowing)效應(yīng)很相像。在Delphi中,如果在派生類中聲明的方法與基類中的方法名稱相同,并且未使用特殊指令字,則系統(tǒng)將啟動(dòng)隱藏機(jī)制[3,4],即隱藏從基類繼承的同名方法,并用派生類中新聲明的方法代替它。在其他語言中也存在隱藏機(jī)制[5,6],只是實(shí)現(xiàn)的細(xì)節(jié)略有差異。例如,C#中的new關(guān)鍵字不僅可用于為變量(指針)分配內(nèi)存,還可以在派生類的方法聲明中使用,以實(shí)現(xiàn)隱藏機(jī)制[6]。
覆蓋與隱藏容易被混淆的原因如下:教科書中涉及甚少或解釋混亂;它們均涉及基類和派生類中的同名方法;均可作用于虛方法和動(dòng)態(tài)方法。
在Delphi中,方法覆蓋必須使用指令字override,它是區(qū)分覆蓋和隱藏的重要標(biāo)志,這一點(diǎn)與C#相同[6]。如果在派生類中聲明的方法與基類的虛方法或動(dòng)態(tài)方法同名同參,但不含override指令字,則新的聲明只是隱藏繼承的方法而不覆蓋它。在派生類中,方法名是靜態(tài)(早期)綁定的,方法的調(diào)用取決于對象變量的聲明類型而不是實(shí)際類型,其效果類似于靜態(tài)方法的重新聲明。教學(xué)中通過對覆蓋和隱藏的對比,可以引導(dǎo)學(xué)生透過現(xiàn)象認(rèn)識(shí)其本質(zhì),消除認(rèn)識(shí)誤區(qū)(見表2)。
5重載與隱藏的比較
Delphi中的方法重載必須遵守兩個(gè)基本規(guī)則:①使用overload指令字;②方法同名異參;二者缺一不可。這是區(qū)分重載與隱藏的主要標(biāo)志。
如果在派生類中聲明了與基類中同名異參的方法,但未使用overload指令字,則繼承于基類的同名方法將被隱藏;此時(shí)聲明類型為派生類的對象已不能直接調(diào)用繼承的基類同名方法,無法實(shí)現(xiàn)重載。
如果使用了overload指令字,而派生類與基類中的方法同名同參,盡管編譯時(shí)仍可通過,但這樣做沒有意義,實(shí)際效果與方法的隱藏相同。此時(shí)聲明類型為派生類的對象仍然不能直接調(diào)用繼承于基類的同名方法,并未實(shí)現(xiàn)真正意義上的重載。
重載與隱藏容易被混淆的原因如下:二者均涉及基類和派生類中的同名異參方法;它們均可作用于靜態(tài)方法、虛方法和動(dòng)態(tài)方法;均采用早期綁定;用于虛方法和動(dòng)態(tài)方法時(shí)均使用附加指令字reintroduce,以避開編譯器警告。
由于二者相似點(diǎn)較多,因此筆者在教學(xué)中運(yùn)用對比法在形似中求質(zhì)異,強(qiáng)調(diào)其本質(zhì)區(qū)別(見表3)。
6結(jié)束語
覆蓋、重載和隱藏是多態(tài)性教學(xué)中的重點(diǎn)和難點(diǎn)概念,筆者在教學(xué)過程中不僅將比較教學(xué)法應(yīng)用于這些概念的理論辨析,而且配以形似質(zhì)異的典型示例程序強(qiáng)化比較教學(xué)法的實(shí)施效果。因篇幅所限,未將程序示例納入本文。盡管比較教學(xué)法的適用范圍較廣,但要注意避免濫用,應(yīng)當(dāng)根據(jù)教學(xué)目標(biāo)的要求,遵循3W原則:明確比較的目的(Why),選準(zhǔn)適于比較的內(nèi)容(What),采用恰當(dāng)?shù)谋容^方式(How);如此方可充分發(fā)揮比較教學(xué)法的優(yōu)勢,收到事半功倍之效。
參考文獻(xiàn)
[1] 趙曉東. 比較教學(xué)法與工程機(jī)械教學(xué)[J]. 中國職業(yè)技術(shù)教育,2006,(19): 47-48.
[2] 李運(yùn)模. 比較教學(xué)法論略[J]. 中南民族學(xué)院學(xué)報(bào)(人文社會(huì)科學(xué)版),2000,20(3):125-127.
[3] Marco Cantù. Mastering Borland Delphi 2005[M]. USA: SYBEX Inc., 2005.
[4] 劉藝. Delphi面向?qū)ο缶幊趟枷隱M]. 北京:機(jī)械工業(yè)出版社,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