




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章面向?qū)ο蠹夹g(shù)本章主要內(nèi)容:理解面向?qū)ο蟮母拍詈吞卣?。熟悉類、屬性、方法的定義。初步應(yīng)用類和對象。理解構(gòu)造函數(shù)和析構(gòu)函數(shù)。進(jìn)一步理解事件。初步應(yīng)用事件。理解并初步實(shí)現(xiàn)繼承和多態(tài)。6.1面向?qū)ο蠡靖拍蠲嫦驅(qū)ο蟪绦蛟O(shè)計(jì)與傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)是不同的,它將實(shí)際生活中的各種事物都看作是對象,并將對象作為程序設(shè)計(jì)的關(guān)鍵,因此,符合人類認(rèn)識世界的思維特點(diǎn)。每個對象既有自己的狀態(tài)和屬性,又有相應(yīng)的行為和動作。如何利用抽象化思維和語言工具獲得程序中使用的對象則是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心技術(shù)。為了能更好地理解和運(yùn)用面向?qū)ο蠹夹g(shù),本章在后續(xù)的內(nèi)容中通過不斷完善學(xué)生這個類和相應(yīng)對象進(jìn)行介紹。6.1.1類與對象要掌握面向?qū)ο蠹夹g(shù),首先要知道什么是對象和類。在第1章中已經(jīng)提到窗體類及其對象(frmHelloWorld)和Button類及其對象(btnSayHello、btnQuit),因此我們知道,對象是類的實(shí)例,類是對象的抽象描述。這里我們以學(xué)生為例進(jìn)一步說明類和對象的概念。例如:在學(xué)生信息管理軟件中,處理的數(shù)據(jù)主要是每個學(xué)生的各類信息,因此,可以把每個學(xué)生的相關(guān)信息及對這些信息的處理看成是一個整體,即一個對象。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,可以按照下面的步驟進(jìn)行分析:⑴針對每一個具體的學(xué)生,我們可以分析其包含的屬性和行為,屬性可能有:學(xué)號、姓名、性別、出生日期、政治面貌、專業(yè)、成績、借書數(shù)量、所借書目列表、頭發(fā)顏色、眼睛大小、DNA、牙齒個數(shù)等等;行為可能有:信息注冊、信息瀏覽、退學(xué)、借書、還書、考試、打球、跑步、聽歌、上網(wǎng)等。⑵根據(jù)(1)列出的每個具體學(xué)生的屬性和行為,結(jié)合學(xué)生信息管理軟件中對學(xué)生信息的需求,挑選出在該軟件中必須處理的信息和行為,把這些屬性和行為放到一起,即描述為學(xué)生類:學(xué)生類{
屬性:學(xué)號、姓名、專業(yè)、借書數(shù)量、所借書目列表;行為:信息注冊、信息瀏覽、借書、娛樂;}可以看出,通過具體的學(xué)生信息抽象出的學(xué)生類,包含的屬性和行為比具體的學(xué)生的屬性和行為少,這是因?yàn)樵谠撥浖校瑢τ诿總€具體的學(xué)生,只關(guān)注學(xué)生類中描述的這些屬性和行為,其它屬性和行為可以忽略不考慮。⑶在程序中以⑵中抽象出的學(xué)生類為類型(自定義類型),創(chuàng)建具體的學(xué)生對象,每個學(xué)生對象即為學(xué)生類的一個實(shí)例。這些學(xué)生對象包含的屬性和行為,即為學(xué)生信息管理軟件中管理的每個學(xué)生的屬性和行為。對“具體學(xué)生→學(xué)生類→學(xué)生對象”的分析過程如圖6-1所示。圖6-1具體學(xué)生、學(xué)生類及學(xué)生對象關(guān)系學(xué)生對象1學(xué)號、姓名、專業(yè)、借書數(shù)量、所借書目列表信息注冊、信息瀏覽、借書、娛樂學(xué)生對象2學(xué)號、姓名、專業(yè)、借書數(shù)量、所借書目列表信息注冊、信息瀏覽、借書、娛樂學(xué)生類:屬性:學(xué)號、姓名、專業(yè)、借書數(shù)量、所借書目列表行為:信息注冊、信息瀏覽、借書、娛樂實(shí)例化實(shí)例化實(shí)例化屬性:…行為:娛樂…學(xué)生對象3學(xué)號、姓名、專業(yè)、借書數(shù)量、所借書目列表信息注冊、信息瀏覽、借書、娛樂抽象抽象抽象6.1.2面向?qū)ο蠡咎卣鱒isualBasic2005作為可視化的面向?qū)ο缶幊陶Z言,很好地支持了面向?qū)ο蟮娜齻€基本特征:封裝、繼承和多態(tài)。例如,工具箱中的按鈕Button類包含有Name(名字標(biāo)識)、Text(顯示文本)、ForeColor(前景色)、Size(大小)、Location(位置)等屬性和Click(單擊)等事件聲明,因此,可提供給用戶直接使用,而用戶并不需要了解Button類內(nèi)部的具體實(shí)現(xiàn);同時也有利于開發(fā)者調(diào)試和維護(hù)。這就是封裝的體現(xiàn)。如果希望創(chuàng)建個性化的按鈕,則可繼承原來的Button類生成新的按鈕類,不需要全部重新開發(fā)新按鈕類,從而通過重用已有的類,并進(jìn)一步添加修改來實(shí)現(xiàn)新的類,因此,可提高軟件開發(fā)效率,減少工作量。如果新舊按鈕類有不同的Play方法,當(dāng)發(fā)出Play操作后,對應(yīng)新舊按鈕類的不同對象會自動選擇自己的Play方法來執(zhí)行,得到不同的效果。這就是多態(tài)的體現(xiàn)。以學(xué)生為例,進(jìn)一步理解面向?qū)ο蟮娜齻€基本特征。通過對所有學(xué)生個體進(jìn)行抽象可得到學(xué)生類,例如所有學(xué)生都有學(xué)號、姓名、專業(yè)、借書數(shù)量與所借書目列表等屬性和信息注冊、信息瀏覽、借書與娛樂等行為,因此構(gòu)建的學(xué)生類就封裝了上述信息,圖6-1中的學(xué)生類已經(jīng)體現(xiàn)了信息的封裝。學(xué)生中有科協(xié)成員和合唱團(tuán)成員,于是可通過繼承學(xué)生類的方式實(shí)現(xiàn)科協(xié)成員類和合唱團(tuán)成員類,這時科協(xié)成員類和合唱團(tuán)成員類可以繼承學(xué)生類原有的屬性和方法,并進(jìn)一步修改或擴(kuò)展科協(xié)成員類和合唱團(tuán)成員類的相關(guān)信息,例如假定最初學(xué)生類沒有娛樂行為,那么科協(xié)成員類和合唱團(tuán)成員類可以在原有學(xué)生類的行為基礎(chǔ)上分別增加上網(wǎng)和聽音樂的行為,圖6-2描述了這種繼承機(jī)制。科協(xié)成員類:屬性:…行為:…上網(wǎng)(新增)學(xué)生類:屬性:…行為:…合唱團(tuán)成員類:屬性:…行為:…聽音樂(新增)圖6-2通過繼承學(xué)生類實(shí)現(xiàn)科協(xié)成員類和合唱團(tuán)成員類學(xué)生個體的娛樂行為是不同的。同樣是娛樂,張三可能上網(wǎng),李四可能聽音樂,王五可能打球,呈現(xiàn)出多態(tài),例如假定最初學(xué)生類有娛樂行為,而科協(xié)成員類和合唱團(tuán)成員類在繼承原有學(xué)生類的同時重新定義了各自的娛樂行為,即科協(xié)成員上網(wǎng)和合唱團(tuán)成員聽音樂。這時如果張三是科協(xié)成員,那么他的娛樂行為就是上網(wǎng);如果張三是合唱團(tuán)成員,那么他的娛樂行為就是聽音樂,這種自動選擇娛樂行為的效果就是多態(tài)機(jī)制的體現(xiàn),如圖6-3所示。圖6-3科協(xié)成員類和合唱團(tuán)成員類自動選擇娛樂行為的多態(tài)體現(xiàn)科協(xié)成員類:屬性:…行為:娛樂(上網(wǎng))…學(xué)生類:屬性:…行為:娛樂()…合唱團(tuán)成員類:屬性:…行為:娛樂(聽音樂)…娛樂(上網(wǎng))娛樂(聽音樂)6.2初步應(yīng)用類和對象為了讓大家有直觀的認(rèn)識,我們以VisualBasic2005為例介紹前面提到的學(xué)生類的創(chuàng)建和初步應(yīng)用,包括如何定義類及其成員(屬性、方法)。6.2.1定義類定義類的基本形式是:
Class類名
…… EndClass通常,和類相關(guān)的所有信息都應(yīng)包括在其中,包括各種屬性和相關(guān)的方法。有了類定義,就可以創(chuàng)建該類的對象。創(chuàng)建對象的基本形式是:
Dim對象名AsNew類名例6.1建立學(xué)生類,其中包括學(xué)生的學(xué)號、姓名、專業(yè)基本信息。具體操作過程:⑴新建項(xiàng)目,選擇“Windows應(yīng)用程序”,把“名稱”修改為“學(xué)生基本信息”,然后單擊“確定”,并在解決方案資源管理器中將Form1.vb修改為frmStudent.vb。⑵打開窗體設(shè)計(jì)視圖,選擇frmStudent窗體,并在屬性框中修改窗體的屬性:StartPosition為“CenterScreen”;Text為“學(xué)生基本信息”。⑶在“項(xiàng)目”菜單中單擊“添加類”,彈出“添加新項(xiàng)”對話框,把類“名稱”改為“Student.vb”,然后單擊“添加”。⑷在“Student.vb”代碼設(shè)計(jì)視圖中依次添加strNo、strName和strMajor信息。PublicClassStudent '定義學(xué)生學(xué)號、姓名、專業(yè)基本信息DimstrNoAsStringDimstrNameAsStringDimstrMajorAsString
EndClass提示:類中用Dim定義變量信息,也可用Private,其作用相同。建議不要用Public定義變量,這將會破壞類的封裝性,這是因?yàn)橛肞ublic定義的變量將對類外公開。6.2.2定義屬性我們知道,工具箱中的控件有許多屬性,例如按鈕Button的屬性Text表示按鈕上顯示的文本信息,使用時既可讀取Text屬性,也可修改該屬性。定義屬性的標(biāo)準(zhǔn)方式是在類中使用Property語句,基本形式是:PublicProperty屬性名()As屬性類型
…… Get …… Return屬性值
EndGet Set(參數(shù)value) …… EndSet ……EndProperty其中Get部分用于返回屬性值,不需要提供參數(shù),可利用Return語句返回屬性值;Set部分用于設(shè)置/修改屬性值,通常有一個參數(shù)value將其值傳遞給該屬性。例6.2考慮到學(xué)生借閱圖書的情況,假定每個學(xué)生最多借10本書。在學(xué)生類中定義一個私有變量intBTotal,表示目前學(xué)生已借圖書的總數(shù),初值為0;同時增加一個表示學(xué)生已借書總數(shù)的屬性intTotal,然后在窗體中訪問該屬性。具體操作過程:⑴新建項(xiàng)目,選擇“Windows應(yīng)用程序”,把“名稱”修改為“圖書總數(shù)屬性”,然后單擊“確定”,并在解決方案資源管理器中將Form1.vb修改為frmStudent.vb。⑵將窗體frmStudent的Text屬性改為“圖書總數(shù)屬性”。⑶添加學(xué)生類Student,具體操作過程同例6.1。⑷在“Student.vb”的代碼編輯器中,往Student類中添加定義私有變量intBTotal和屬性intTotal的代碼:PublicClassStudentPrivatestrNoAsString '定義學(xué)生學(xué)號、姓名、專業(yè)基本信息
PrivatestrNameAsStringPrivatestrMajorAsStringPrivateintBTotalAsInteger=0'學(xué)生已借圖書的總數(shù)PublicPropertyintTotal()AsIntegerGet ReturnintBTotal EndGetSet(ByValvalueAsInteger)Ifvalue<0Thenvalue=0'intBTotal的值在0-10之間
Ifvalue>10Thenvalue=10
intBTotal=valueEndSetEndPropertyEndClass⑸在“frmStudent.vb”的代碼編輯器中,往frmStudent類中添加生成Student類的對象stuZhangsan的代碼:PublicClassfrmStudentDimstuZhangsanAsNewStudent'新建Student類的對象stuZhangsanEndClass⑹為窗體添加1個Label控件和1個TextBox控件,將Label控件的Text改為“當(dāng)前屬性值:”,將TextBox控件的Name改為“txtTotal”。⑺為窗體添加2個Button控件,將Name分別改為“btnGet”、“btnSet”,Text分別改為“讀取”、“設(shè)置”。⑻雙擊“讀取”按鈕,在“讀取”按鈕Click事件過程中添加響應(yīng)代碼:PrivateSubbtnGet_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnGet.Click
txtTotal.Text=stuZTotal()'讀取屬性EndSub⑼雙擊“設(shè)置”按鈕,在“設(shè)置”按鈕Click事件過程中添加響應(yīng)代碼:PrivateSubbtnSet_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnSet.Click
stuZTotal()=txtTotal.Text'設(shè)置屬性EndSub可能有人會問:學(xué)生怎能自己修改intTotal屬性呢?的確如此,因此需要對intTotal屬性進(jìn)行限制,即不能修改,但可以讀取。這實(shí)際上是要求創(chuàng)建只讀屬性,標(biāo)準(zhǔn)的做法是在屬性定義語句中加入ReadOnly,即PublicReadonlyPropertyintTotal()AsInteger,此時屬性定義中只有Get部分,不出現(xiàn)Set部分。類似地,可以加入WriteOnly來創(chuàng)建只寫屬性,即PublicWriteOnlyPropertyintTotal()AsInteger,此時屬性定義中只有Set部分,不出現(xiàn)Get部分,即屬性只能修改,但不能讀取。6.2.3定義方法關(guān)于類方法,其實(shí)在前面講述的內(nèi)容中一直在使用。例如窗體Form就有常見的方法Show和Hide,分別用于窗體的顯示和隱藏,通過方法Close關(guān)閉窗體并退出程序執(zhí)行等。通常在類中定義的函數(shù)或過程就是方法。要使用類方法,一般需要先用new生成該類的對象實(shí)例,然后利用對象調(diào)用對應(yīng)的方法。但共享方法例外,使用共享方法時不需要創(chuàng)建該類的對象實(shí)例,直接從類調(diào)用共享方法,定義共享方法時需在方法前加入Shared修飾符。例如數(shù)組類Array的排序方法Sort就是共享方法。例6.3在例6.1學(xué)生類中添加方法InputStuInfo和OutputStuInfo,利用對話框錄入顯示學(xué)生基本信息。具體操作過程:⑴新建項(xiàng)目,選擇“Windows應(yīng)用程序”,并把“名稱”修改為“學(xué)生基本信息顯示方法”,然后單擊“確定”,并在解決方案資源管理器中將Form1.vb修改為frmStudent.vb。⑵將窗體frmStudent的Text屬性改為“學(xué)生基本信息顯示方法”。⑶添加學(xué)生類Student,具體操作過程同例6.1。⑷在“Student.vb”的代碼編輯器中,往Student類中添加方法InputStuInfo和OutputStuInfo的代碼:PublicClassStudent ……PublicSubInputStuInfo()
strNo=InputBox("請輸入學(xué)號","學(xué)生基本信息錄入")
strName=InputBox("請輸入姓名","學(xué)生基本信息錄入")
strMajor=InputBox("請輸入專業(yè)","學(xué)生基本信息錄入")EndSub
PublicSubOutputStuInfo()DimstrInfoStrAsString
strInfoStr="基本信息:"&vbNewLine&"學(xué)號:"&strNo&vbNewLine&"姓名:"&strName&vbNewLine&"專業(yè):"&strMajor
MessageBox.Show(strInfoStr,"學(xué)生基本信息顯示",MessageBoxButtons.OK)EndSubEndClass提示:調(diào)用InputBox時,在一對話框中顯示提示,等待用戶輸入文字或單擊按鈕,然后返回包含文本框內(nèi)容的字符串。InputBox的調(diào)用格式為:PublicFunctionInputBox(_
ByValPromptAsString,_ OptionalByValTitleAsString="",_ OptionalByVal
DefaultResponseAsString="",_ OptionalByVal
XposAsInteger=-1,_ OptionalByVal
YPosAsInteger=-1_)AsString參數(shù)的含義:Prompt:必選,以消息形式顯示在對話框中的String表達(dá)式。如果Prompt包含多行,則可以在每行之間使用回車字符(Chr(13))、換行符(Chr(10))或者回車/換行符的組合(Chr(13)&Chr(10))來分隔各行。Title:可選,顯示在對話框標(biāo)題欄中的String表達(dá)式。如果省略Title,則將應(yīng)用程序名放在標(biāo)題欄中。DefaultResponse
:可選,顯示在文本框中的String表達(dá)式,在沒有提供其他輸入時作為默認(rèn)響應(yīng)。如果省略DefaultResponse,則顯示的文本框?yàn)榭铡Pos:可選。數(shù)值表達(dá)式,以緹為單位指定對話框的左邊與屏幕左邊的距離。如省略XPos,對話框?qū)⑺骄又?。YPos
:可選,數(shù)值表達(dá)式,以緹為單位指定對話框的上邊與屏幕上邊的距離。如果省略YPos,則對話框位于在屏幕垂直方向距下邊緣大約三分之一處。⑸在“frmStudent.vb”的代碼編輯器中,往frmStudent類中添加生成Student類的對象stuZhangsan的代碼:PublicClassfrmStudentDimstuZhangsanAsNewStudent'新建Student類的對象stuZhangsanEndClass⑹雙擊frmStudent窗體,在frmStudent窗體Load事件過程中添加響應(yīng)代碼:PrivateSubfrmStudent_Load(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesMyBase.LoadstuZhangsan.InputStuInfo()
stuZhangsan.OutputStuInfo()EndSub例6.4以學(xué)生借書為例。在學(xué)生類中添加私有變量altBList和方法BorrowBook,altBlist表示目前學(xué)生已借圖書的列表,BorrowBook表示學(xué)生借書同時修改altBlist,一次可借1本,也可借多本,但最多不超過10本。用方法BorrowBook實(shí)現(xiàn)不同的借書情況,并在窗體上顯示相關(guān)信息。具體操作過程:⑴新建項(xiàng)目,選擇“Windows應(yīng)用程序”,把“名稱”修改為“學(xué)生借書方法”,然后單擊“確定”,并在解決方案資源管理器中將Form1.vb修改為frmStudent.vb。⑵將窗體frmStudent的Text屬性改為“學(xué)生借書方法”。⑶添加學(xué)生類Student,具體操作過程同例6.2。⑷在“Student.vb”的代碼編輯器中,往Student類中添加方法InputStuInfo和OutputStuInfo和定義數(shù)組altBList的代碼:PublicClassStudent'定義學(xué)生學(xué)號、姓名、專業(yè)基本信息
PrivatestrNoAsStringPrivatestrNameAsStringPrivatestrMajorAsStringPrivateintBTotalAsInteger=0'學(xué)生已借圖書的總數(shù)PrivatealtBListAsNewArrayList()'學(xué)生已借圖書的書目列表,下標(biāo)為0-9
PublicSubBorrowBook(ByRef
strBNOAsString)
intBTotal=intBTotal+1If(intBTotal<11AndstrBNO<>"")Then'已借圖書總數(shù)最多10本且所借書名不為空
altBList.Add(strBNO)
MessageBox.Show("借書一本操作成功!","有效操作",MessageBoxButtons.OK)Else
intBTotal=intBTotal-1
MessageBox.Show("對不起,借書總數(shù)已到最大值或書名空白!","無效操作",MessageBoxButtons.OK)EndIfEndSub
PublicSubBorrowBook(ByRef
altBNOlistAsArrayList)'學(xué)生一次借閱圖書的書目列表
intBTotal=intBTotal+altBNOlist.CountIf(intBTotal<11AndaltBNOlist.Count<>0)Then '已借圖書總數(shù)最多10本且添加所借書目列表不為空
altBList.AddRange(altBNOlist)
MessageBox.Show("借書登記操作成功!","有效操作",MessageBoxButtons.OK)Else
intBTotal=intBTotal-altBNOlist.Count
MessageBox.Show("對不起,借書總數(shù)已到最大值或書名列表空白!","無效操作",MessageBoxButtons.OK)EndIfEndSubEndClass⑸為窗體添加3個Label控件,分別將Text改為“可借閱書目列表(請?jiān)谒钑壳按蚬矗骸?、“選擇的書目列表”和“輸入1本書名:”;添加1個TextBox控件,將Name改為“txtOneBName”;添加1個ListBox控件,將Name改為“l(fā)bxBListed”,MultiColumn改為“True”;添加1個CheckedListBox控件,將Name改為“clbBList”,CheckOnClick改為“True”,MultiColumn改為“True”,并在Items字符串集合編輯器中依次輸入15個書名,每行一個。⑹為窗體添加2個Button控件,分別將Name改為“btnBorrow”和“btnBorrowOne”,將Text改為“借閱”和“借閱一本”。⑺在frmStudent類中生成Student類的對象stuZhangsan,即在PublicClassfrmStudent后添加代碼:DimstuZhangsanAsNewStudent'新建Student類的對象stuZhangsan。⑻雙擊“借閱”按鈕,在“借閱”按鈕Click事件過程中添加響應(yīng)代碼:PrivateSubbtnBorrow_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnBorrow.ClickDimaltBookListAsNewArrayList()DimintNAsInteger=0DimintIAsInteger
lbxBListed.Items.Clear()'選擇書目列表清空
altBookList.Clear()'數(shù)組清空
intN=clbBList.Items.Count
ForintI=0TointN-1If(clbBList.GetItemChecked(intI)=True)Then'判斷選擇列表框中項(xiàng)目是否勾選
altBookList.Add(clbBList.Items(intI))'勾選項(xiàng)目添加到數(shù)組中
EndIfNext
ForintI=0ToaltBookList.Count-1
lbxBListed.Items.Add(altBookList(intI))'勾選項(xiàng)目添加到列表框中
Next
stuZhangsan.BorrowBook(altBookList)'以數(shù)組為參數(shù)調(diào)用BorrowBook方法
ForintI=0TointN-1
clbBList.SetItemChecked(intI,False)'清空選擇列表框
Next
lbxBListed.Items.Clear()'清空書目列表框EndSub⑼雙擊“借閱一本”按鈕,在“借閱一本”按鈕Click事件過程中添加響應(yīng)代碼:
PrivateSubbtnBorrowOne_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnBorrowOne.Click
lbxBListed.Items.Clear()
lbxBListed.Items.Add(txtOneBName.Text)
stuZhangsan.BorrowBook(txtOneBName.Text)'以字符串為參數(shù)調(diào)用BorrowBook方法
lbxBListed.Items.Clear()
txtOneBName.Text=""
EndSub提示:學(xué)生類Student中有兩個BorrowBook方法,名字相同,但參數(shù)不同,一個是字符串,另一個是數(shù)組。這是方法的重載。6.2.4可訪問性在前面第三章介紹過程和變量時,已經(jīng)解釋了修飾符Public和Private的用法。對于類中定義的變量、屬性和方法(過程或函數(shù)),都可以使用不同的修飾符規(guī)定各自的訪問級別,從而實(shí)現(xiàn)類中數(shù)據(jù)訪問的差異性和安全性。VisualBasic2005中提供了Public、Protected、Friend、ProtectedFriend、Private等多種訪問修飾符,這里我們只介紹Public、Protected和Private三種修飾符的含義。用Public修飾的變量、屬性和方法(過程或函數(shù)),訪問時沒有限制,即不僅在類的內(nèi)部可以訪問,而且從類的外部也可以訪問。實(shí)際上,它們可看作是類對外公開的訪問接口。需要注意的是,雖然用Public修飾比較方便,但考慮到信息的隱藏,建議大家慎重選擇。用Protected修飾的變量、屬性和方法(過程或函數(shù)),訪問時有一定的限制,即不僅在類的內(nèi)部可以訪問,而且繼承該類的類從外部也可以訪問。與Public相比,不同之處在于,對類的外部而言,只有繼承該類的類才能進(jìn)行訪問。例如,在學(xué)生類中用Protected修飾的變量、屬性和方法,除了在學(xué)生類中和繼承它的科協(xié)成員類與合唱團(tuán)成員類中可以訪問外,其它地方就不能再訪問它們了。用Private修飾的變量、屬性和方法(過程或函數(shù)),訪問時限制最多,即只能在類的內(nèi)部可以訪問,而從類的外部將禁止訪問,包括繼承該類的類也不能進(jìn)行訪問。實(shí)際上,它們完全是私密的,不希望直接對外公開。6.3構(gòu)造函數(shù)和析構(gòu)函數(shù)現(xiàn)在我們已經(jīng)知道了如何定義完整的類及其對象,并了解了方法重載。下面介紹類中兩個特殊的方法:構(gòu)造函數(shù)和析構(gòu)函數(shù)。每個類中都有構(gòu)造函數(shù)和析構(gòu)函數(shù),在相應(yīng)對象建立和刪除的時候由系統(tǒng)自動調(diào)用,不能被顯式調(diào)用。構(gòu)造函數(shù)通常在對象建立時自動對對象進(jìn)行初始化工作(例如為對象分配資源等),而析構(gòu)函數(shù)則恰恰相反,在對象刪除時進(jìn)行收尾工作(例如回收分配給對象的資源等)。如果沒有明確定義,系統(tǒng)會有默認(rèn)的構(gòu)造函數(shù)和析構(gòu)函數(shù),但沒有任何操作。如果需要在對象創(chuàng)建、刪除時進(jìn)行一些操作,則需要在類中明確定義構(gòu)造函數(shù)和析構(gòu)函數(shù)。構(gòu)造函數(shù)的名字必須是New,但可以在類中通過定義不同參數(shù)形成多個構(gòu)造函數(shù),顯然這是New的重載。析構(gòu)函數(shù)的名字是Destruct,不帶參數(shù),而且只能有一個。例6.5在例6.1學(xué)生類中添加構(gòu)造函數(shù)和析構(gòu)函數(shù),利用對話框顯示執(zhí)行過程。具體操作過程:⑴新建項(xiàng)目,選擇“Windows應(yīng)用程序”,把“名稱”修改為“學(xué)生類構(gòu)造析構(gòu)函數(shù)”,然后單擊“確定”,并在解決方案資源管理器中將Form1.vb修改為frmStudent.vb。⑵將窗體frmStudent的Text屬性改為“學(xué)生類構(gòu)造析構(gòu)函數(shù)”。⑶添加學(xué)生類Student,具體操作過程同例6.1。⑷在“Student.vb”的代碼編輯器中,往Student類中添加構(gòu)造函數(shù)和析構(gòu)函數(shù)的代碼:PublicClassStudent ……PublicSubNew()'構(gòu)造函數(shù),創(chuàng)建Student對象時顯示提示信息
MessageBox.Show("這是我定義的構(gòu)造函數(shù)","New")EndSub
PublicSubDestruct()'析構(gòu)函數(shù),刪除Student對象時顯示提示信息
MessageBox.Show("這是我定義的析構(gòu)函數(shù)","Destruct")EndSubEndClass⑸在“frmStudent.vb”的代碼編輯器中,往frmStudent類中添加生成Student類的對象stuZhangsan的代碼:PublicClassfrmStudentDimstuZhangsanAsNewStudent'新建Student類的對象stuZhangsanEndClass⑹雙擊frmStudent窗體,在frmStudent窗體Load事件過程中添加響應(yīng)代碼:PrivateSubfrmStudent_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadMessageBox.Show("這是程序的開始","Form_load")
stuZhangsan=Nothing'空引用,中斷stuZhangsan和任何特定對象的關(guān)聯(lián)
MessageBox.Show("這是程序的結(jié)束","Form_load")
EndSub6.4事件及其基本應(yīng)用我們在使用Windows操作系統(tǒng)時,經(jīng)常需要用鼠標(biāo)或鍵盤點(diǎn)擊程序窗體上的“確定”或“取消”按鈕。這實(shí)際就觸發(fā)了一個Button_Click事件。其實(shí)Windows系統(tǒng)下大多數(shù)程序都是事件驅(qū)動的。如果我們希望點(diǎn)擊按鈕后提交我們的選課信息,那么這時就需要我們自己編寫一些代碼來實(shí)現(xiàn)這件事,這些寫在Button_Click里的代碼就是對應(yīng)的事件處理程序。注意事件處理程序不能被顯式調(diào)用,而是在滿足某種條件時被觸發(fā)執(zhí)行。通常,系統(tǒng)已經(jīng)定義好按鈕控件Button的Click事件,用戶需要做的就是編寫相應(yīng)的事件處理程序。但是我們也可以自己定義一些事件,同時規(guī)定好事件的觸發(fā)條件,如同Button的Click事件一樣,提供給用戶使用。對于控件的事件及其使用,我們在前面的學(xué)習(xí)中已經(jīng)有所了解,這里我們將以學(xué)生借書為例子解釋自定義事件及其使用。6.4.1使用事件的步驟這里先說明通常使用事件的操作步驟:⑴使用Event在類、結(jié)構(gòu)、模塊和接口內(nèi)部聲明事件,例如Click。⑵使用RaiseEvent
語句引發(fā)事件,例如指定為按鈕Button的事件,就規(guī)定了只有按下按鈕才會觸發(fā)Click事件。⑶編寫該事件的事件處理程序,就是觸發(fā)該事件時執(zhí)行的代碼,例如按下按鈕后執(zhí)行的Click事件代碼。⑷使用Handles或AddHandler
語句將所謂的事件處理程序與事件進(jìn)行關(guān)聯(lián),這樣才能使事件處理程序真正起作用,例如,按下按鈕Button必然會找到Button_Click中的代碼執(zhí)行。提示:事件處理程序與事件關(guān)聯(lián)的標(biāo)準(zhǔn)方法是使用Handles和WithEvents,但動態(tài)啟動事件的AddHandler
更加靈活。兩種關(guān)聯(lián)方法可選擇使用,但不能在一個事件中同時使用。6.4.2事件的基本應(yīng)用例6.6在例6.4的基礎(chǔ)上練習(xí)自定義事件的使用。仍以學(xué)生借書為例,界面和功能不變,代碼稍作修改,用事件實(shí)現(xiàn)學(xué)生借書總數(shù)超過10本時的信息提示。具體改動如下:⑴在“Student.vb”的代碼編輯器中,往Student類中添加事件BookToMax的聲明代碼:PublicEventBookToMax()'添加事件聲明⑵在“Student.vb”的代碼編輯器中,往Student類中添加引發(fā)事件BookToMax的代碼,注意這里僅僅將其中的BorrowBook方法部分改寫,代碼如下:PublicSubBorrowBook(ByRef
altBNOlistAsArrayList)'學(xué)生一次借閱圖書的書目列表
intBTotal=intBTotal+altBNOlist.Count
If(intBTotal<11AndaltBNOlist.Count<>0)Then '已借圖書總數(shù)最多10本且添加所借書目列表不為空
altBList.AddRange(altBNOlist)
MessageBox.Show("借書登記操作成功!","有效操作",MessageBoxButtons.OK)Else
intBTotal=intBTotal-altBNOlist.CountIf(altBNOlist.Count=0)Then '添加所借書目列表為空
MessageBox.Show("對不起,書名列表空白!","無效操作",MessageBoxButtons.OK)Else '已借圖書總數(shù)超過10本
RaiseEvent
BookToMax()'引發(fā)BookToMax事件
EndIfEndIfEndSub⑶在“frmStudent.vb”的代碼編輯器中,往Student類中添加過程InvalidTip的代碼,準(zhǔn)備用于處理事件:
SubInvalidTip() '定義事件處理程序
MessageBox.Show("對不起,借書總數(shù)已到最大值!","無效操作",MessageBoxButtons.OK)EndSub⑷雙擊frmStudent窗體,在frmStudent窗體Load事件過程中添加響應(yīng)代碼:PrivateSubfrmStudent_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load'用AddHandler將事件BookToMax和事件處理程序InvalidTip動態(tài)連接
AddHandler
stuZhangsan.BookToMax,AddressOf
InvalidTip
EndSub6.5繼承正如前面舉例提到的,我們可以通過繼承已有的系統(tǒng)提供的類或自己編寫好的類來得到新的類,這使我們既可很快寫出程序,又能保證程序的質(zhì)量。提供出來供繼承的類稱為基類,繼承其它類的類則稱為派生類。派生類可直接獲得基類的屬性、方法和事件,同時也可以進(jìn)行擴(kuò)展或重寫。VisualBasic中的所有對象都可看作是從共同基類System..Object派生出來的。在前面的例子中,學(xué)生類是基類,科協(xié)成員類則是派生類。在VisualBasic中,實(shí)現(xiàn)繼承的常見方法是將Inherit語句作為派生類的第一條語句,表示繼承基類中非Private聲明的所有成員。具體用法是:Inherits基類名稱需要注意的是,該語句必須是類的第一條語句,而且基類名字只能是一個,因?yàn)閂isualBasic只支持單一繼承。例6.7考慮到學(xué)校內(nèi)部有很多學(xué)生社團(tuán),例如學(xué)生科協(xié),假定科協(xié)成員喜歡上網(wǎng)。我們讓科協(xié)成員類直接繼承學(xué)生類,同時在科協(xié)成員類中添加Play方法,指定娛樂方式是上網(wǎng)。具體操作過程:⑴新建項(xiàng)目,選擇“Windows應(yīng)用程序”,把“名稱”修改為“科協(xié)成員繼承學(xué)生”,然后單擊“確定”,并在解決方案資源管理器中將Form1.vb修改為frmStudent.vb。⑵將窗體frmStudent的Text屬性改為“科協(xié)成員繼承學(xué)生”。⑶添加學(xué)生類Student,包括基本信息和方法InputStuInfo和OutputStuInfo,具體操作過程同例6.3。⑷在“Student.vb”的代碼編輯器中,添加定義科協(xié)成員類SCMember的代碼:PublicClassSCMember'定義科協(xié)成員類
InheritsStudent'從Student類派生
PublicSubPlay()'增加方法Play
Process.Start("")EndSubEndClass提示:通過Process組件可以啟動、停止應(yīng)用程序(進(jìn)程),也可以控制和監(jiān)視正在運(yùn)行的應(yīng)用程序。Process.Start("")運(yùn)行的結(jié)果是:啟動本地主機(jī)的默認(rèn)瀏覽器,訪問http://Web服務(wù)。⑸在“frmStudent.vb”的代碼編輯器中,往frmStudent類中添加生成SCMember類的對象scmLisi的代碼:PublicClassfrmStudent
DimscmLisiAsNewStudent.SCMember'新建SCMember類的對象scmLisiEndClass⑹雙擊frmStudent窗體,在frmStudent窗體Load事件過程中添加響應(yīng)代碼:PrivateSubfrmStudent_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadscmLisi.InputStuInfo()scmLisi.OutputStuInfo()scmLisi.Play()EndSub提示:scmLisi是科協(xié)成員類對象,但繼承了父類Student的方法InputStuInfo和OutputStuInfo,而且添加了新方法Play。6.6多態(tài)前面已經(jīng)舉例解釋了多態(tài)的含義,多態(tài)就是類中方法名字相同但實(shí)現(xiàn)的功能卻不同。具體來說,就是在基類中定義方法,同時在派生類中重寫該方法,從而實(shí)現(xiàn)不同的功能效果,而且調(diào)用時只需要知道是派生類的對象即可,并不需要指定是哪個具體類的對象。這就帶來了很大的方便,尤其是以后類的維護(hù)和功能的維護(hù)。學(xué)生類中定義了娛樂Play方法,在科協(xié)成員類和合唱團(tuán)成員類中也都繼承實(shí)現(xiàn)各自的Play方法,分別實(shí)現(xiàn)上網(wǎng)和聽歌曲的娛樂功能。我們在調(diào)用娛樂Play方法時,只要知道是學(xué)生類派生的對象就可以了,至于到底是科協(xié)成員對象還是合唱團(tuán)成員對象,我們就不用操心了,多態(tài)機(jī)制會自動幫我們做出正確的選擇判斷。前面的例子是VisualBasic中基于繼承實(shí)現(xiàn)的多態(tài),當(dāng)然也可實(shí)現(xiàn)更為抽象的基于接口實(shí)現(xiàn)的多態(tài),而且多態(tài)概念也涉及到屬性。這里我們就不再進(jìn)一步討論了。多態(tài)的具體實(shí)現(xiàn)是:⑴在基類中用Overridable修飾方法,表示基類中的該方法可以在派生類中被重寫,即在基類中聲明可以在子類中重新定義該方法;⑵在派生類中用Overrides修飾該方法,表示在派生類中重寫基類里已經(jīng)用Overridable修飾的方法,即在派生類中重新定義基類里用Overridable修飾的方法的功能。例6.8考慮到每個學(xué)生有自己的娛樂方式,在例6.1學(xué)生類中添加空方法Play。假定學(xué)生社團(tuán)有科協(xié)和合唱團(tuán),科協(xié)成員喜歡上網(wǎng),合唱團(tuán)成員喜歡聽歌曲。我們讓科協(xié)成員類和合唱團(tuán)成員類直接繼承學(xué)生類,同時在科協(xié)成員類中添加Play方法,指定娛樂方式是上網(wǎng),在合唱團(tuán)成員類中添加Play方法,指定娛樂方式是聽歌曲。這樣當(dāng)學(xué)生是科協(xié)成員時自動打開瀏覽器上網(wǎng),當(dāng)學(xué)生是合唱團(tuán)成員時自動打開播放器聽歌曲。具體操作過程:⑴新建項(xiàng)目,選擇“Windows應(yīng)用程序”,把“名稱”修改為“科協(xié)合唱團(tuán)多態(tài)”,然后單擊“確定”,并在解決方案資源管理器中將Form1.vb修改為frmStudent.vb。⑵將窗體frmStudent的Text屬性改為“科協(xié)合唱團(tuán)多態(tài)”。⑶在例6.1學(xué)生類中Student添加空方法Play,并在“Student.vb”代碼編輯器中再增加科協(xié)成員類和合唱團(tuán)成員類兩個類,它們直接繼承學(xué)生類,代碼如下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北京考貨運(yùn)資格證考試內(nèi)容
- 產(chǎn)品技術(shù)服務(wù)合同
- 信貸業(yè)務(wù)審批流程詳述
- 全新顧問聘用協(xié)議
- 《數(shù)據(jù)可視化技術(shù)應(yīng)用》2.2 揭示商品庫存數(shù)據(jù)動態(tài)-教案
- 2025年遼陽道路貨運(yùn)駕駛員從業(yè)資格證考試
- 營林生產(chǎn)松林擇間伐改造提升承攬合同6篇
- 《藥物分析》課程標(biāo)準(zhǔn)
- 駕校合伙投資合同范本
- 單位食堂聘用合同范本
- 初中英語語法時態(tài)總復(fù)習(xí)課件
- 零碳數(shù)據(jù)算力中心項(xiàng)目可行性研究報告
- 研究生復(fù)試流程
- 濰坊市2025屆高三下學(xué)期開學(xué)考(診斷性調(diào)研監(jiān)測)政治試題(含答案)
- 2025年浙江國有資本運(yùn)營有限公司招聘筆試參考題庫含答案解析
- 人教版(2025新版)七年級下冊數(shù)學(xué)第七章 相交線與平行線 單元測試卷(含答案)
- 汽輪機(jī)輔機(jī)培訓(xùn)
- 主題班會:預(yù)防流行性感冒課件
- 對外援助成套項(xiàng)目管理辦法(試行)
- 管道吹掃、試壓檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
- 教學(xué)教案、作業(yè)、記錄檢查記錄表
評論
0/150
提交評論