《Visual Basic.NET程序設(shè)計(jì)教程》第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)
《Visual Basic.NET程序設(shè)計(jì)教程》第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)
《Visual Basic.NET程序設(shè)計(jì)教程》第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)
《Visual Basic.NET程序設(shè)計(jì)教程》第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)
《Visual Basic.NET程序設(shè)計(jì)教程》第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩70頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章

面向?qū)ο蟪绦蛟O(shè)計(jì)本章要點(diǎn):面向?qū)ο蟪绦蛟O(shè)計(jì)基本概念定義類和對(duì)象類的繼承類的多態(tài)性1面向?qū)ο蟪绦蛟O(shè)計(jì)的引入:現(xiàn)實(shí)世界:由對(duì)象以及對(duì)象之間的相互作用和聯(lián)系構(gòu)成。反映現(xiàn)實(shí)世界的系統(tǒng):直接通過(guò)對(duì)象及其相互聯(lián)系來(lái)反映世界,這樣建立起來(lái)的系統(tǒng)才能符合現(xiàn)實(shí)世界的本來(lái)面目。面向?qū)ο蟪绦蛟O(shè)計(jì):按照人們對(duì)現(xiàn)實(shí)世界的習(xí)慣認(rèn)識(shí)和思維方式來(lái)設(shè)計(jì)和組織程序,將現(xiàn)實(shí)世界中的任何事物都看做是對(duì)象,通過(guò)在對(duì)象之間建立相互聯(lián)系來(lái)解決實(shí)際問(wèn)題。面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言:必須有描述對(duì)象及其相互之間聯(lián)系的語(yǔ)言成分。29.1面向?qū)ο蟪绦蛟O(shè)計(jì)基本概念

1.對(duì)象(Object)對(duì)象:是現(xiàn)實(shí)世界中各種實(shí)體的抽象表示。對(duì)象中封裝了描述該對(duì)象的屬性(數(shù)據(jù))和方法(行為方式),是數(shù)據(jù)和代碼的組合。屬性:描述了對(duì)象的特征。方法:決定要向哪個(gè)對(duì)象發(fā)消息、發(fā)什么消息以及收到消息時(shí)如何進(jìn)行處理等。32.類(Class)和類的實(shí)例(Instance)類:對(duì)具有相同屬性和行為的一組對(duì)象的抽象。對(duì)象的屬性和方法是在定義類時(shí)被指定的。類的實(shí)例:每一個(gè)屬于某個(gè)類的特定對(duì)象稱為該類的一個(gè)實(shí)例,通常簡(jiǎn)稱為對(duì)象。預(yù)定義類:如Button類、Label類、TextBox類等。自定義類:用戶可以定義自己的類,為它們定義屬性、方法和事件,然后利用自己定義的類創(chuàng)建相應(yīng)的對(duì)象。43.封裝(Encapsulation)對(duì)象中包含了描述該對(duì)象的屬性和方法,這種技術(shù)叫做封裝。通過(guò)封裝性可以將對(duì)象的內(nèi)部復(fù)雜性與應(yīng)用程序的其他部分隔離開來(lái),這樣,在程序中使用一個(gè)對(duì)象時(shí)就不必關(guān)心對(duì)象的內(nèi)部是如何實(shí)現(xiàn)的,而每一個(gè)對(duì)象僅有若干接口為應(yīng)用程序所使用。封裝使對(duì)象的內(nèi)部實(shí)現(xiàn)與外界應(yīng)用分割開來(lái),可以有效地防止外界對(duì)對(duì)象內(nèi)部的數(shù)據(jù)和代碼的破壞,也避免了程序各部分之間數(shù)據(jù)的濫用。54.繼承(Inheritance)繼承:在已有類的基礎(chǔ)上通過(guò)增加新特征而派生出新的類。其原有的類稱為基類或父類,而新建的類稱為派生類或子類。在繼承機(jī)制中,派生類會(huì)自動(dòng)繼承其基類的屬性和方法。繼承性還可以使得在一個(gè)類上所做的改動(dòng),能夠自動(dòng)反映到它的所有派生類中?;惖膬?nèi)容在派生類中可以直接使用而不必重新定義,減少了軟件開發(fā)的工作量,實(shí)現(xiàn)了代碼的重用。65.多態(tài)(Polymorphism)在通過(guò)繼承而派生出的一系列類中,可能存在一些名稱相同但實(shí)現(xiàn)過(guò)程和功能不同的方法多態(tài)性有兩個(gè)方面的含義:將同一個(gè)消息發(fā)送給同一個(gè)對(duì)象,但由于消息的參數(shù)不同,對(duì)象表現(xiàn)出不同的行為,這種多態(tài)性是通過(guò)“重載”來(lái)實(shí)現(xiàn)的。將同一個(gè)消息發(fā)送給不同的對(duì)象,各對(duì)象表現(xiàn)出的行為各不相同,這種多態(tài)性是通過(guò)“重寫”來(lái)實(shí)現(xiàn)的。79.2定義類和對(duì)象

VB.NET有各種各樣的類,如Form(窗體)類、Button(命令按鈕)類、Math(數(shù)學(xué)函數(shù))類等,這些類都是VB.NET系統(tǒng)提供的,稱為預(yù)定義類。對(duì)于預(yù)定義類,用戶不能進(jìn)行修改,只能用來(lái)創(chuàng)建對(duì)象或者派生出新的類。如果預(yù)定義類不能滿足用戶的需要,則用戶也可以自己定義新的類。89.2.1定義類的語(yǔ)法格式簡(jiǎn)單格式:[訪問(wèn)修飾符]Class類名

類定義體EndClass說(shuō)明:1)訪問(wèn)修飾符:Public、Private、Protected等,用于表示類的訪問(wèn)權(quán)限,如果省略“訪問(wèn)修飾符”,則默認(rèn)為Public。9Public:類可以在任意位置被訪問(wèn)。Private:類必須在另一個(gè)類之內(nèi),且該類只能在其所在的類的內(nèi)部被訪問(wèn)。Protected:類必須在另一個(gè)類之內(nèi),使用Protected定義的類僅可以在其所在類的內(nèi)部、或從其所在類的派生類中被訪問(wèn)。2)類名:應(yīng)符合標(biāo)識(shí)符的命名規(guī)則。3)類定義體:用于定義類內(nèi)部的成員,包括:數(shù)據(jù)成員、屬性、方法和事件。109.2.2定義類的位置1)與窗體類并列定義,例如:PublicClassForml

'窗體類定義開始…EndClass

'窗體類定義結(jié)束ClassMyClass1

'用戶自定義類開始…EndClass

'用戶自定義類結(jié)束112)在窗體類中定義類,新類嵌在原有的窗體類中,例如:PublicClassForml

'窗體類定義開始

ClassMyclass2

'用戶自定義類開始

EndClass

'用戶自定義類結(jié)束

…Endclass'窗體類定義結(jié)束123)在標(biāo)準(zhǔn)模塊中定義類,例如:ModuleModulel

'模塊定義開始…

ClassMyClass3

'用戶自定義類開始…

Endclass

'用戶自定義類結(jié)束…EndModule

'模塊定義結(jié)束134)創(chuàng)建類文件,在其中定義類使用“項(xiàng)目|添加類”命令,彈出“添加新項(xiàng)”對(duì)話框。在其中間窗格中選擇“類”,并在下面的“名稱”文本框中指定類名稱,單擊“添加”按鈕,則新建立一個(gè)類文件,并在代碼窗口中自動(dòng)添加了一個(gè)空類的模板:

PublicClass

……

'在這里可以編寫類的有關(guān)代碼

EndClass一個(gè)類文件可以包含多個(gè)類,每個(gè)類都單獨(dú)使用Class和End

Class語(yǔ)句來(lái)定義。149.2.3定義對(duì)象如果已經(jīng)定義了某個(gè)類,則可以創(chuàng)建屬于該類的對(duì)象(實(shí)例)。類本質(zhì)上是一種數(shù)據(jù)類型,用類創(chuàng)建一個(gè)對(duì)象,實(shí)際上就是聲明一個(gè)屬于該類類型的變量。定義對(duì)象的常見語(yǔ)法格式:

{Dim|Private|Public}對(duì)象變量名[As[New]類名][(參數(shù)表)][=表達(dá)式]15說(shuō)明:1)Dim、Private、Public的含義與普通變量聲明中的含義相同。2)“類名”可以是預(yù)定義的類(如Form類、TextBox類、Button類、Math類等),也可以是用戶自己定義的類。3)使用New關(guān)鍵字表示要?jiǎng)?chuàng)建一個(gè)類的實(shí)例。如果省略New關(guān)鍵字,則表示聲明了屬于某種類的變量,而不創(chuàng)建類的實(shí)例。4)參數(shù)表:創(chuàng)建類的實(shí)例所需要的參數(shù)。參數(shù)的個(gè)數(shù)、類型由類的構(gòu)造函數(shù)決定。也可以沒有參數(shù)表,這時(shí)可以省略小括號(hào)。16例:設(shè)已經(jīng)創(chuàng)建了一個(gè)名稱為student的類,使用以下方法可以創(chuàng)建該類的實(shí)例,即創(chuàng)建對(duì)象student1。①使用沒有參數(shù)的構(gòu)造函數(shù)創(chuàng)建對(duì)象student1:

Dimstudent1AsNewstudent()

或?qū)懗桑?/p>

Dimstudent1=Newstudent()

或?qū)懗桑?/p>

Dimstudent1Asstudent

student1=Newstudent()

或?qū)懗桑?/p>

Dimstudent1Asstudent=Newstudent()17②用帶參數(shù)的構(gòu)造函數(shù)創(chuàng)建對(duì)象student2:

Dimstudent2AsNewstudent("Tom")

或?qū)懗桑?/p>

Dimstudent2=Newstudent("Tom")

或?qū)懗桑?/p>

Dimstudent2Asstudent

student2=Newstudent("Tom")

或?qū)懗桑?/p>

Dimstudent2Asstudent=Newstudent("Tom")185)可以定義對(duì)象數(shù)組例:DimC(9)AsMyClass1則數(shù)組C的所有元素都是MyClass1對(duì)象類型例:對(duì)每一個(gè)數(shù)組元素創(chuàng)建一個(gè)對(duì)象的實(shí)例

錯(cuò)誤寫法:

DimC(9)AsNewMyClass1

正確寫法:

DimC(9)AsMyClass1

Fori=0To9

C(i)=NewMyClass1

Nexti196)訪問(wèn)對(duì)象成員一般格式:

對(duì)象變量名.成員名注意:被訪問(wèn)的成員必須在類中被聲明為Public訪問(wèn)權(quán)限,因?yàn)橹挥羞@種類型的成員才能在類的外部被訪問(wèn)。例:DimButton2AsNewButton

Button2.Text="退出"209.2.4定義數(shù)據(jù)成員類中的數(shù)據(jù)成員用于存儲(chǔ)有關(guān)的數(shù)據(jù),表示對(duì)象的狀態(tài)和特征,也稱為字段變量。數(shù)據(jù)成員通常在類的開始部分定義,在類的內(nèi)部使用,就像局部變量一樣。定義數(shù)據(jù)成員的基本語(yǔ)法格式:{Public|Private|Dim}數(shù)據(jù)成員名

As數(shù)據(jù)類型=[初始值]21說(shuō)明:使用Private或Dim定義的數(shù)據(jù)成員只能在類內(nèi)部被訪問(wèn)使用Public定義的數(shù)據(jù)成員可以在應(yīng)用程序的任何部分被訪問(wèn),但一般情況下不在類中聲明Public類型的數(shù)據(jù)成員?!?初始值”:對(duì)該成員進(jìn)行初始化。22例如:PublicClassStudent

Private

SnoAsString'學(xué)號(hào)

Private

SnameAsString'姓名

PrivateScoreAsSingle'成績(jī)EndClass239.2.5定義屬性簡(jiǎn)單格式:[訪問(wèn)修飾符][屬性修飾符][ReadOnly|WriteOnly]Property屬性名(形參表)As類型

Get

語(yǔ)句組EndGet

Set(ByVal形參名As

數(shù)據(jù)類型)

語(yǔ)句組EndSetEndProperty24說(shuō)明:1)訪問(wèn)修飾符:指定屬性的訪問(wèn)權(quán)限。可以是Public、Private、Protected等,省略時(shí)默認(rèn)為Public。2)屬性修飾符:可以是Overloads、Overrides、Overridable等。(見9.4節(jié))。3)Get…EndGet部分用于定義獲取屬性值的操作。如果沒有此部分,則該屬性為只寫屬性,這時(shí)在Property語(yǔ)句中需要注明WriteOnly。4)Set…EndSet部分用于定義設(shè)置屬性值的操作。如果沒有此部分,則該屬性為只讀屬性,這時(shí)在Property語(yǔ)句中需要注明ReadOnly。25例:以下是一個(gè)典型的屬性定義格式Dim變量名As數(shù)據(jù)類型

'定義私有變量PublicProperty屬性名()As數(shù)據(jù)類型GetReturn變量名

'將變量的值作為屬性值返回EndGet

Set(ByValValueAs數(shù)據(jù)類型)

變量名

=Value'用Value的值設(shè)置屬性值EndSetEndProperty注意:變量的數(shù)據(jù)類型必須與屬性的數(shù)據(jù)類型相同。26【例9-1】創(chuàng)建一個(gè)矩形類Rectangle,定義Width和Height兩個(gè)屬性。編寫代碼實(shí)現(xiàn),運(yùn)行時(shí),單擊“寫入屬性”按鈕用文本框中輸入的內(nèi)容設(shè)置一個(gè)Rectangle對(duì)象的Width和Height屬性;單擊“讀出屬性”按鈕用另外兩個(gè)文本框顯示該對(duì)象的Width和Height屬性。Button1Button2TextBox1TextBox2TextBox3TextBox4界面設(shè)計(jì):27代碼設(shè)計(jì):1)在代碼窗口的PublicClassForm1之后輸入以下代碼,創(chuàng)建Rectangle類。

PublicClassRectangle

'定義矩形類

DimWAsInteger'變量w用于存儲(chǔ)寬度屬性

DimHAsInteger'變量H用于存儲(chǔ)高度屬性

'定義寬度屬性

PublicPropertyWidth()AsInteger

GetReturnWEndGet

Set(ByValValueAsInteger)W=ValueEndSetEndProperty

28'定義高度屬性

PublicPropertyHeight()AsIntegerGetReturnHEndGet

Set(ByValValueAsInteger)H=ValueEndSet

EndPropertyEndClass292)創(chuàng)建一個(gè)屬于Rectangle類的對(duì)象,即在以上代碼之后繼續(xù)輸入語(yǔ)句:

Dimc1AsNewRectangle3)編寫B(tài)utton1_Click事件過(guò)程實(shí)現(xiàn)屬性的設(shè)置:

PrivateSubButton1_Click(…)HandlesButton1.Click

c1.Width=Val(TextBox1.Text)

c1.Height=Val(TextBox2.Text)

EndSub4)編寫B(tài)utton2_Click事件過(guò)程實(shí)現(xiàn)屬性的讀取:

PrivateSubButton2_Click(…)HandlesButton2.Click

TextBox3.Text=c1.Width

TextBox4.Text=c1.Height

EndSub302.自動(dòng)實(shí)現(xiàn)的屬性使用“自動(dòng)實(shí)現(xiàn)的屬性”功能可以快速定義類的屬性,而無(wú)需編寫Get過(guò)程和Set過(guò)程例如,為例9-1的Rectangle類定義屬性:PublicClassRectangle

'定義寬度屬性PublicPropertyWidthAsInteger

'定義高度屬性PublicPropertyHeightAsIntegerEndClass31通過(guò)自動(dòng)實(shí)現(xiàn)的屬性,可在一行中聲明一個(gè)包含默認(rèn)值的屬性。例:PublicClassRectanglePublicPropertyWidthAsInteger=100PublicPropertyHeightAsInteger=200EndClass雖然自動(dòng)實(shí)現(xiàn)的屬性使用方便,但在某些情況下不能使用。例如,如果要在設(shè)置一個(gè)電話號(hào)碼屬性值之前,驗(yàn)證電話號(hào)碼是否包含合法的數(shù)字,則需要在Set過(guò)程中添加相關(guān)的判斷代碼,這種情況下就必須自己編寫Set過(guò)程。329.2.6定義方法方法是封裝在類內(nèi)部的完成特定操作的過(guò)程,它代表由該類所生成的對(duì)象所具有的行為特征。創(chuàng)建方法實(shí)際上就是在類中編寫若干Sub過(guò)程或Function過(guò)程。聲明的格式和以前在窗體中聲明Sub過(guò)程或Function過(guò)程類似,只不過(guò)在窗體中定義的Sub過(guò)程或Function過(guò)程屬于窗體類,而現(xiàn)在定義的Sub過(guò)程或Function過(guò)程屬于自己定義的類。類的方法也稱為類的成員函數(shù)。331.用Sub過(guò)程實(shí)現(xiàn)沒有返回值的方法:[訪問(wèn)修飾符][過(guò)程修飾符]Sub方法名([形參表])…EndSub2.用Function過(guò)程實(shí)現(xiàn)有返回值的方法:[訪問(wèn)修飾符][過(guò)程修飾符]Function方法名([形參表])AS數(shù)據(jù)類型

…EndSub說(shuō)明:1)訪問(wèn)修飾符:指定所定義的方法的訪問(wèn)權(quán)限。可以是Public、Private、Protected等,默認(rèn)為Public。2)過(guò)程修飾符:可以是Overloads、Overrides、Overridable等(9.4節(jié)介紹)34【例9-2】給例9-1創(chuàng)建的Rectangle類定義一個(gè)計(jì)算矩形面積的方法是Area(),并測(cè)試使用該方法計(jì)算矩形的面積。界面設(shè)計(jì):Button1Button2TextBox1TextBox2TextBox5Button3TextBox3TextBox435代碼設(shè)計(jì):1)向Rectangle類中添加方法Area。PublicClassRectangle'定義矩形類

…'這里省略了例9-1定義屬性的代碼

PublicFunctionArea()AsIntegerReturnW*HEndFunctionEndClass2)在Button3.Click事件過(guò)程中調(diào)用Area方法計(jì)算面積PrivateSubButton3_Click(…)HandlesButton3.ClickTextBox5.Text=c1.AreaEndSub369.2.7定義事件1.定義事件的步驟:1)在類中聲明一個(gè)事件,格式如下:[Public|Private|Protected]Event事件名稱([形參表])說(shuō)明:Public、Private、Protected:指定該事件可以被訪問(wèn)的范圍。省略時(shí)默認(rèn)為是Public。形參表:是事件用來(lái)傳遞數(shù)據(jù)的參數(shù),也可以沒有參數(shù)。372)在類中的某個(gè)方法中,使用RaiseEvent語(yǔ)句激發(fā)事件,格式如下:

RaiseEvent

事件名稱([實(shí)參表])說(shuō)明:事件名稱:指要被引發(fā)的事件名稱。該事件必須是已經(jīng)使用步驟1)聲明的事件實(shí)參表:指事件發(fā)生時(shí)需要傳遞的實(shí)際參數(shù)。實(shí)際參數(shù)的類型、個(gè)數(shù)要與1)中所聲明的事件的形式參數(shù)的類型、個(gè)數(shù)保持一致。382.使用類中定義的事件1)用WithEvents關(guān)鍵字聲明一個(gè)對(duì)象:

DimWithEvents

對(duì)象名AsNew類名2)為對(duì)象響應(yīng)該事件編寫相應(yīng)的事件過(guò)程,事件過(guò)程時(shí),通常以“對(duì)象名_事件名”作為事件過(guò)程的名稱,并以“Handles”關(guān)鍵字來(lái)指定此過(guò)程所要處理的是哪一個(gè)事件,其語(yǔ)法格式如下:

PrivateSub對(duì)象名_事件名(參數(shù)列表)Handles對(duì)象名.事件名39【例9-3】在例9-2定義的Rectangle類中,定義一個(gè)InvalidData事件,當(dāng)使用Area方法計(jì)算的面積小于0時(shí),引發(fā)該事件,并返回面積0。然后編寫c1_InvalidData事件過(guò)程實(shí)現(xiàn):當(dāng)計(jì)算的面積小于0時(shí),用消息框給出提示。代碼設(shè)計(jì):1)在Rectangle類中,使用Event語(yǔ)句聲明事件InvalidData;在Rectangle類中的Area方法中,使用RaiseEvent語(yǔ)句引發(fā)InvalidData事件,則定義Rectangle類的代碼如下:40PublicClassRectangle'定義矩形類

DimWAsInteger

'變量w用于存儲(chǔ)寬度屬性

DimHAsInteger

'變量H用于存儲(chǔ)高度屬性

…'這里省略了定義寬度和高度屬性的代碼

PublicEventInvalidData()'聲明事件InvalidData

PublicFunctionArea()AsInteger'定義方法Area

IfW*H<0Then

RaiseEvent

InvalidData()

'引發(fā)InvalidData事件

Return0

Else

ReturnW*H

EndIf

EndFunction

EndClass412)將對(duì)象c1改成用WithEvents關(guān)鍵字聲明:

DimWithEventsc1AsNewRectangle

3)編寫對(duì)象c1_InvalidData的事件過(guò)程:

PrivateSubc1_InvalidData()Handlesc1.InvalidData

MsgBox("出現(xiàn)了非法面積,將面積作為0看待")

EndSub429.2.8構(gòu)造函數(shù)和析構(gòu)函數(shù)1.構(gòu)造函數(shù)在創(chuàng)建一個(gè)對(duì)象的同時(shí),可以為其數(shù)據(jù)成員提供初值,對(duì)該對(duì)象進(jìn)行初始化。對(duì)象的初始化是由類中的一個(gè)特殊的成員函數(shù)完成的,這個(gè)成員函數(shù)稱為構(gòu)造函數(shù)。在類中定義構(gòu)造函數(shù)的一般格式如下:PublicSubNew([形參表])…EndSub43說(shuō)明1)構(gòu)造函數(shù)的名稱必須是New,且必須是一個(gè)訪問(wèn)權(quán)限為Public的Sub過(guò)程。2)可以在類中定義多個(gè)參數(shù)不同而名稱都為New的構(gòu)造函數(shù)。在創(chuàng)建對(duì)象時(shí),系統(tǒng)會(huì)根據(jù)參數(shù)的類型及個(gè)數(shù)選擇調(diào)用相應(yīng)的構(gòu)造函數(shù)完成對(duì)象的初始化。3)在創(chuàng)建對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),而不能像在程序中調(diào)用普通函數(shù)那樣顯式地調(diào)用構(gòu)造函數(shù)。44PublicClassRectangle'定義矩形類

DimWAsInteger'變量w用于存儲(chǔ)寬度屬性

DimHAsInteger'變量H用于存儲(chǔ)高度屬性

'定義構(gòu)造函數(shù)

PublicSubNew(ByVal

aAsInteger,ByVal

bAsInteger)W=aH=bEndSub……'定義寬度屬性和高度屬性EndClass【例9-4】在例9-3的基礎(chǔ)上,為Rectangle類創(chuàng)建一個(gè)構(gòu)造函數(shù)。

以下代碼創(chuàng)建對(duì)象c1,并將其Width屬性和Height屬性初始化為10和20:DimWithEventsc1AsNewRectangle(10,20)45每個(gè)類必須有一個(gè)構(gòu)造函數(shù),沒有構(gòu)造函數(shù)就不能創(chuàng)建對(duì)象。如果在類中沒有顯式定義構(gòu)造函數(shù),則系統(tǒng)會(huì)自動(dòng)為該類生成一個(gè)默認(rèn)的構(gòu)造函數(shù),格式如下:

PublicSubNew()EndSub該默認(rèn)構(gòu)造僅負(fù)責(zé)創(chuàng)建對(duì)象,不做任何初始化工作。如果在類中已經(jīng)顯式定義過(guò)任何形式的構(gòu)造函數(shù),系統(tǒng)就不再生成默認(rèn)的構(gòu)造函數(shù)了。因此,常需要在類中再人為增加一個(gè)沒有參數(shù)的構(gòu)造函數(shù)2.默認(rèn)構(gòu)造函數(shù)46PublicClassRectangle'定義矩形類

DimWAsInteger

DimHAsInteger

'定義帶參數(shù)的構(gòu)造函數(shù)

PublicSubNew(ByValaAsInteger,ByValbAsInteger)W=aH=bEndSub'定義不帶參數(shù)的構(gòu)造函數(shù)

PublicSubNew()EndSub……'定義寬度和高度屬性EndClass例:473.析構(gòu)函數(shù)對(duì)象可以被創(chuàng)建,也可以被銷毀。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)自動(dòng)為它分配資源。當(dāng)銷毀對(duì)象時(shí),系統(tǒng)自動(dòng)收回所分配的資源。在對(duì)象的生存周期結(jié)束時(shí),系統(tǒng)將自動(dòng)調(diào)用析構(gòu)函數(shù)完成對(duì)象的銷毀。析構(gòu)函數(shù)是一個(gè)名為Finalize的Sub過(guò)程,用戶可以在自定義類中重載Finalize完成對(duì)象的銷毀工作。VB2005及更高版本允許使用另一析構(gòu)函數(shù)Dispose,可以在任何時(shí)候顯式調(diào)用該函數(shù)來(lái)立即釋放資源。48*9.3類的繼承在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,可以在已有類的基礎(chǔ)上通過(guò)增加新特征而派生出新的類,這種機(jī)制稱為繼承。在繼承關(guān)系中,被繼承的類稱為基類或父類,而通過(guò)繼承關(guān)系定義出來(lái)的新類則稱為派生類或子類。499.3.1派生類的定義格式:[訪問(wèn)修飾符]Class派生類名

Inherits基類名

…EndClass說(shuō)明:1)Inherits語(yǔ)句必須緊跟在Class語(yǔ)句的后面。2)派生類繼承了基類中除構(gòu)造函數(shù)和析構(gòu)函數(shù)之外的全部成員,各成員的訪問(wèn)方式由其在基類中定義時(shí)所使用的訪問(wèn)修飾符(如Public、Private、Protected等)來(lái)決定。509.3.2派生類的構(gòu)造函數(shù)派生類繼承了基類中除構(gòu)造函數(shù)和析構(gòu)函數(shù)之外的全部成員,若需要對(duì)派生類對(duì)象進(jìn)行初始化,則需要定義新的構(gòu)造函數(shù),并且該構(gòu)造函數(shù)負(fù)責(zé)調(diào)用基類的構(gòu)造函數(shù),以完成基類的有關(guān)成員的初始化工作。定義派生類的構(gòu)造函數(shù)的一般格式如下:PublicSubNew(派生類構(gòu)造函數(shù)總形參表)

MyBase.New(基類構(gòu)造函數(shù)形參數(shù))

派生類數(shù)據(jù)成員的初始化EndSub51說(shuō)明:1)關(guān)鍵字MyBase表示的是當(dāng)前派生類的基類,MyBase.New(…)表示調(diào)用基類的構(gòu)造函數(shù)并對(duì)基類的有關(guān)數(shù)據(jù)成員進(jìn)行初始化。2)“派生類構(gòu)造函數(shù)總形參表”中的參數(shù)必須包括既能完成對(duì)派生類的數(shù)據(jù)成員初始化,又能完成對(duì)其基類的數(shù)據(jù)成員初始化的全部參數(shù),也就是說(shuō),MyBase.New(基類構(gòu)造函數(shù)形參表)中的“基類構(gòu)造函數(shù)形參表”的參數(shù)來(lái)自“派生類構(gòu)造函數(shù)總形參表”。52【例9-5】定義一個(gè)表示點(diǎn)的類Point,然后在Point類的基礎(chǔ)上派生出一個(gè)表示圓的類Circle,并編寫有關(guān)的程序進(jìn)行測(cè)試。界面設(shè)計(jì):53PublicClassForm1PrivateSubForm1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.ClickDimPAsNewPoint(10,20)'定義點(diǎn)類對(duì)象pDimCAsNewCircle(30,40,10)'定義圓類對(duì)象cLabel1.Text="點(diǎn)P的坐標(biāo)為("&P.橫坐標(biāo)

&","&P.縱坐標(biāo)

&")"Label2.Text="圓C的圓心坐標(biāo)為("&C.橫坐標(biāo)

&","&C.縱坐標(biāo)

&"),半徑為"&C.半徑

EndSubEndClass代碼設(shè)計(jì):54PublicClassPoint'定義點(diǎn)類

PrivateXAsSingle'X用于保存橫坐標(biāo)屬性

PrivateYAsSingle'Y用于保存縱坐標(biāo)屬性

'定義有參數(shù)的構(gòu)造函數(shù)PublicSubNew(ByVal

px,ByVal

py)X=pxY=pyEndSub

'定義無(wú)參數(shù)的構(gòu)造函數(shù)PublicSubNew()EndSub55

'定義屬性“橫坐標(biāo)”

PublicProperty橫坐標(biāo)()AsSingleGetReturnX'返回橫坐標(biāo)EndGet

Set(ByValvalueAsSingle)X=value

'設(shè)置橫坐標(biāo)EndSetEndProperty56

'定義屬性“縱坐標(biāo)”

PublicProperty縱坐標(biāo)()AsSingle

GetReturnY'返回縱坐標(biāo)EndGet

Set(ByValvalueAsSingle)Y=value'設(shè)置縱坐標(biāo)EndSetEndPropertyEndClass57PublicClassCircle'定義派生類CircleInheritsPoint'指定Circle的基類為PointPrivateRAsSingle'R用于保存圓的半徑

'定義有參數(shù)的構(gòu)造函數(shù)PublicSubNew(ByVal

cxAsSingle,ByVal

cyAsSingle,ByVal

crAsSingle)

MyBase.New(cx,cy)'調(diào)用基類的構(gòu)造函數(shù)R=cr

'對(duì)派生類的成員R初始化EndSubPublicSubNew()'定義無(wú)參數(shù)的構(gòu)造函數(shù)EndSub58

'定義屬性“半徑”

PublicProperty半徑()AsSingle

GetReturnR'返回半徑REndGet

Set(ByValvalueAsSingle)R=value'設(shè)置半徑REndSetEndPropertyEndClass59

運(yùn)行效果:?jiǎn)螕舸绑w空白處,則分別在Label1和Label2標(biāo)簽中輸出Point類的對(duì)象P和Circle類的對(duì)象C的有關(guān)數(shù)據(jù)成員的值。如下圖:60*9.4類的多態(tài)性多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的另一個(gè)重要特征。類的多態(tài)性可以通過(guò)重載和重寫來(lái)實(shí)現(xiàn)。9.4.1重載(Overloads)重載是指在類中存在多個(gè)同名的屬性或方法的定義,但這些同名的屬性或方法的參數(shù)個(gè)數(shù)或參數(shù)的類型不同。重載有以下兩種情況:611)在同一個(gè)類中出現(xiàn)屬性或方法的重載。這時(shí),在定義屬性或方法時(shí),可以加上修飾符Overloads,也可以不加,但只要其中有一個(gè)屬性或方法加上了修飾符Overloads,其他所有的重載屬性或方法的定義中也必須都加上Overloads。62例如:PublicClassAddClassPublicOverloadsFunction

ad(ByValxAsInteger,

ByValyAsInteger)Returnx+y

EndFunctionPublicOverloadsFunction

ad(ByValxAsString,ByValyAsString)Returnx&y

EndFunctionEndClass63假設(shè)在某命令按鈕的Click事件過(guò)程如下:PrivateSubButton1_Click(…)HandlesButton1.ClickDimc1AsNewAddClassDebug.Print(c1.ad(2,3))Debug.Print(c1.ad("2","3"))EndSub運(yùn)行時(shí)單擊Button1,在即時(shí)窗口打?。?/p>

5

232)在派生類中重載從基類繼承來(lái)的屬性或方法時(shí),需要在派生類中的相應(yīng)屬性和方法的定義中加上修飾符Overloads。649.4.2重寫(Overrides)派生類繼承了基類的屬性和方法之后,往往需要對(duì)繼承來(lái)的屬性和方法進(jìn)行改寫或擴(kuò)充,這就是重寫。重寫與重載不同,重寫要求重寫的方法或?qū)傩耘c被重寫的方法或?qū)傩缘拿Q、參數(shù)個(gè)數(shù)、參數(shù)類型完全相同。重寫要求在基類中定義屬性或方法時(shí)加上修飾符Overridable,表示該方法或?qū)傩钥梢栽谂缮愔斜恢貙懀煌瑫r(shí)在派生類中相應(yīng)的方法或?qū)傩缘亩x中要加上修飾符Overrides,表示對(duì)基類的屬性或方法進(jìn)行了重寫。65【例9-6】在例9-5的Circle類中,增加一個(gè)求圓的面積的方法Area,在Circle類的基礎(chǔ)上派生出一個(gè)表示球的類Ball,在Ball類中對(duì)Circle類的Area方法進(jìn)行重寫,求球的表面積。編寫有關(guān)代碼進(jìn)行測(cè)試。界面設(shè)計(jì):66代碼設(shè)計(jì):1)在Circle類中添加求圓的面積的方法area:PublicClassCircle'定義派生類Circle…

'定義求圓的面積的方法area,并允許重寫PublicOverridableFunctionarea()

ReturnMath.PI*R^2'返回圓的面積

EndFunctionEndClass672)定義派生類Ball,定義求球的表面積的方法area,實(shí)現(xiàn)對(duì)其父類Circle中的area方法的重寫。PublicClassBall'定義派生類BallInheritsCircle'指定Ball的父類為CirclePublicSubNew(ByVal

cxAsSingle,ByValcyAsSingle,ByVal

crAsSingle)

MyBase.New(cx,cy,cr)EndSubPublicSubNew()EndSub

'對(duì)父類的area方法進(jìn)行重寫,求球的表面積PublicOverridesFunctionarea()

Return4*Math.PI*MyBase.半徑^2EndFunctionEndClass683)在Form1_Click事件過(guò)程中增加定義Ball類的對(duì)象B,并添加相關(guān)代碼顯示各對(duì)象的成員值:PrivateSubForm1_Click(…)HandlesMe.ClickDimPAsNewPoint(10,20

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論