VB.NET抽象類應(yīng)用方式剖析
作為一個(gè)經(jīng)驗(yàn)豐富的編程人員來(lái)說(shuō),應(yīng)該會(huì)接觸到VB.NET這一編程語(yǔ)言。而且通過(guò)學(xué)學(xué)習(xí)知道其實(shí)一款完全面向?qū)ο蟮恼Z(yǔ)言。其中VB.NET抽象類就是一個(gè)面向?qū)ο蟮奶卣髦?。雖然抽象類在編程中的作用常被過(guò)高估計(jì),但抽象類確實(shí)提供了不少開發(fā)可行性。#t#
一段時(shí)間以來(lái),VB程序員都在要求微軟向他們提供全面的備受C++及JAVA程序員推崇的面向?qū)ο蟮奶匦?雖然有少部份與OOP相關(guān)的特征已被添加到舊的版本上,但程序員還得等待VB.NET,將實(shí)際意義上的OOP添加到VB上去。通過(guò)OOP你可以創(chuàng)建VB.NET抽象類 雖然大家都對(duì)它寄予了厚望,但令人慚愧的是抽象類僅僅只能給程序員提供更多的開發(fā)可行性而已.
閱讀本文您需要具備一定的面向?qū)ο笠约癡B.NET的相關(guān)知識(shí).
很容易解釋什么是抽象類? 抽象類即是不能被實(shí)例化的類,而且你不能夠在自己的程序里通過(guò)這種類來(lái)生成一個(gè)對(duì)象.
你也許會(huì)認(rèn)為不能被實(shí)例化的類是沒(méi)多大用處的.事實(shí)上,在某些環(huán)境下, 抽象類是非常有用的.你可以把它作為一個(gè)基礎(chǔ)類以此為基類創(chuàng)建新的類. 在對(duì)功能要求不高的環(huán)境下生成的類,會(huì)向你提供一個(gè)規(guī)定的啟始點(diǎn),通過(guò)這個(gè)點(diǎn)你可以推導(dǎo)出非抽象類.
在此假設(shè)一個(gè)要用VB.NET抽象類的程序設(shè)計(jì)。假設(shè)圖形程序提供了大量的drawing類:比如圓,三角,曲線等等.所有這些作drawing類都有某個(gè)共同的特性,比如位置,大小,色彩,刪除等屬性.其它的類成員,比如描繪圖形的方法就不同于每個(gè)單獨(dú)的類.因此,這樣為利用抽象類創(chuàng)造了一個(gè)理想的環(huán)境.
在VB.NET抽象類中,你需要定義所有drawing類都需要的全部通用類成員. 因?yàn)閐rawing類不響應(yīng)任何圖形.但是當(dāng)把它作為shape-specific drawing類中的base類,你需要確認(rèn)所有這些非-抽象類擁有最基本的功能.
創(chuàng)建抽象類
對(duì)抽象類的定義很簡(jiǎn)單,只要在定義域里加入關(guān)鍵字MustInherit,如:
- Public MustInherit
class MyAbstract class- ...
- End class
除開要包含關(guān)鍵字之外, 抽象類的定義與非抽象類的定義沒(méi)什么兩樣. 抽象類包含了從其它類承繼而來(lái)的屬性及方法等等.但是,在抽象類中定義的類成員(屬性及方法)是如何與衍生類中的定義元素產(chǎn)生聯(lián)系的呢?在此并沒(méi)有復(fù)雜的規(guī)則,但你作出的決定是與你所擁有的類的性能及它將衍生出來(lái)的 類所密切相關(guān)。
你有三個(gè)選擇。
1、VB.NET抽象類中已有的功能比如屬性、方法等在衍生類中可以被重載。實(shí)現(xiàn)這一功能只要在成員定義中輸入Overridable關(guān)鍵字。如:
- Public Overridable
Sub Move(NewX As Integer,
NewY As Integer)- ...
- End Sub
2、為重載abstract base 類中的成員,衍生類在執(zhí)行語(yǔ)句中須使用Overrides關(guān)鍵字段。如:
- Public Overrides Move
(NewX As Integer,
NewY As Integer)- ...
- End Sub
3、VB.NET抽象類中已有的功能不能在衍生類中重載。即是,衍生類必須使用抽象類定義的成員。如果你在抽象類中不使用任何特殊字段來(lái)定義任一成員將會(huì)產(chǎn)生該缺省。以下代碼定義了抽象類中的Xpos屬性。衍生類必須使用該屬性,因?yàn)樵搶傩圆荒鼙恢剌d。如:
- Public Property XPos()
As Integer- ...
- End Property
利用MustOverride關(guān)鍵字來(lái)定義抽象類成員,該成員可以在衍生類中重載。以下舉例說(shuō)明了衍生類必須執(zhí)行名為GetObjectAt()的方法。
- Public MustOverride Function
GetObjectAt(X As Integer,
Y As Integer) As Object
請(qǐng)注意MustOverride成員不需要End Sub 或End Function語(yǔ)句。使用MustOverride最方便的地方在于它不僅規(guī)定了成員的名稱同樣也規(guī)定了成員的符號(hào)。先前的例子要求任一衍生類都需定義名稱為GetObjectAt()的方法,因此會(huì)產(chǎn)生兩種類型的整型變量以及返回一個(gè)類型對(duì)象。該方法是在衍生類中的執(zhí)行是完全根據(jù)程序員的指令要求。通過(guò)MustOverride字段說(shuō)明的方法一些時(shí)候也被稱為abstract 成員。
VB.NET抽象類與接口
如果你熟悉接口的相關(guān)知識(shí),你會(huì)認(rèn)為抽象類與它是如此相似。事實(shí)上只是一部份類似。定義僅含有抽象成員的抽象類基本上是與接口的定義相同的,因?yàn)槟阋呀?jīng)規(guī)定衍生類必須執(zhí)行某個(gè)具有專用符號(hào)的成員。另外,抽象類具有其它的功能,是接口無(wú)法實(shí)現(xiàn)的,--尤其是在定義非抽象類成員的基本功能薄?BR>
當(dāng)你在認(rèn)為抽象類或是接口都能如常運(yùn)作時(shí),請(qǐng)謹(jǐn)記如下幾點(diǎn):
除了從一個(gè)類(抽象或非抽象) 派生出來(lái),一個(gè)衍生類可以執(zhí)行多個(gè)接口。
從抽象類派生出來(lái)的子類同樣能夠執(zhí)行一個(gè)或多個(gè)接口,這要依你的項(xiàng)目而定,你可以只用一個(gè)抽象類或多個(gè)接口,或者抽象類和接口混合使用。VB和.NET在這項(xiàng)工作上提供了非常大的靈活性.因此你可以通過(guò)不同的方式來(lái)達(dá)到你想要的結(jié)果.底線是一些項(xiàng)目必須是通過(guò)抽象類來(lái)實(shí)現(xiàn).VB.NET抽象類也許會(huì)被認(rèn)為是一種非常專業(yè)的編程方法.它可幫程序員減少工作量并且可以生成更簡(jiǎn)便功能更強(qiáng)大的程序.
實(shí)際操作中使用抽象類
設(shè)想一下你正在為一家大公司開發(fā)一個(gè)新的員工數(shù)據(jù)庫(kù).你的工作就是監(jiān)督類的執(zhí)行,使雇員的基本情況與管理部門的要求相吻合,同樣, 在區(qū)分公司分支機(jī)構(gòu)的要求時(shí)也提供更大的便利.
基本要求如下:
抽象類里有姓名,雇用時(shí)間等屬性,這些屬性不會(huì)被重載.
因?yàn)榇蠖鄶?shù)雇員來(lái)自美國(guó),因此在VB.NET抽象類里執(zhí)行退休ID,以運(yùn)行社會(huì)保障號(hào)碼.國(guó)外分公司將會(huì)利用不同的方式來(lái)鑒別雇員的退休ID,因此該屬性會(huì)在衍生類里重載,以便單個(gè)分支機(jī)構(gòu)分別執(zhí)行.
名稱為補(bǔ)償金的方法不會(huì)引起爭(zhēng)議,然后會(huì)返回一個(gè)含有雇員補(bǔ)償金細(xì)節(jié)的類型對(duì)象.因?yàn)椴煌止径家?guī)定不同的補(bǔ)償金,薪金,傭金,紅利等,因此靈活的執(zhí)行這些對(duì)象是很有必要的,由此會(huì)產(chǎn)生一個(gè)抽象方法.
由此而產(chǎn)生的抽象類的代碼,稱為EmployeeBase,會(huì)在***欄里顯示。
位于法國(guó)的分公司的程序員用EmployeeBase類作為EmployeeFrance類的基類,與當(dāng)?shù)毓蛦T記錄軟件合作使用。因此,衍生類需要承繼名稱及雇用日期等字段。更多的是,在EmployeeBase 類中的RetirementID成份適合運(yùn)用在法國(guó),因此,新類不會(huì)重載該成份。程序員做的所有這些工作是為了執(zhí)行abstract Compensation member 的重載。
但是在英國(guó), RetirementID 屬性不適用于該地,因此衍生類將會(huì)重載該成員,同樣的也會(huì)重載Compensation 成員。