OOP技術:易語言面向對象學習_第1頁
OOP技術:易語言面向對象學習_第2頁
OOP技術:易語言面向對象學習_第3頁
OOP技術:易語言面向對象學習_第4頁
OOP技術:易語言面向對象學習_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、OOP技術:易語言面向對象學習當前有很多編程語言都是支持面向對象的,如:DELPHI、VC+、JAVA等,但大家對于概念性的一些內容,取很難去理解、學習,有的學習者因為概念入不了門,使得放棄了進一步深入學習?,F(xiàn)在,易語言38版也支持類(Class)了,因此,本文通過介紹易語言的面向對象的概念,使大家更加容易地學習了解,再去學習其它語言中的相關知識就不會那么難了。一枯燥的理論1對象和類要討論“面向對象”,大家必須首先搞懂什么是“對象”。面向對象編程語言中的“對象”概念和我們日常生活中說的“對象”、“東西”或“實體”非常相似(其實編程語言中的“對象”就是從現(xiàn)實生活中的“對象”、“實體”的概念發(fā)展而

2、來的)??梢灾改忝媲暗倪@臺戴爾電腦或你家樓下的那輛奔馳轎車,也可以指你們公司的銷售員小張。編程語言中的“類”的概念也和現(xiàn)實生活中的“類”非常相似。也是對某一類有共同特征的“東西”(實體,也許我們應該稱“對象”)的概括??梢钥闯?,“類”是一個抽象的概念,比如當你提到“電腦”這個概念時,你指的不是你面前的這臺電腦,不是你家隔壁超市西面出口處用于結帳的那臺電腦,也不是世界上任何一臺具體的電腦,而是指“電腦”這個抽象的概念,是“具有處理器、存儲器和輸入、輸出設備的電子設備”。同樣,“員工”指的也不是你們公司是小張,不是我們公司的小王,也不是世界上任何一家公司的任何一個具體的工作人員,而是“服務于某家公

3、司并定期領取薪水的人”。上面我們所說的“電腦”和“員工”就是兩個“類”,因為它們分別概括了某一類型的“對象”的基本特征。另外要說明的一點是:“類”和“所有這類對象的集合”也是不一樣的,因為后一個概念雖然也很全面,但它指的仍然是一大堆具體的對象,而不是一個抽象的概念。這也許有點像在玩文字游戲,希望你能適應并喜歡這種游戲規(guī)則,畢竟做任何事情都是需要“規(guī)則游戲”的,面向對象編程也不例外哦。2類的“成員”與“方法”每個類一般有它的屬性,比如每個員工都有自己的“姓名”,每到月底都可以領到 “日工資”乘以“本月出勤天數”算出來的工資。這里的“姓名”、“日工資”和“本月出勤天數”就是“員工”這個類的屬性(或

4、叫“成員”)。而每月工資的計算方法(日工資 * 本月出勤天數)就的“員工”類的一個“方法”。在易語言中的類模塊中,一個類看起來就像一個程序集,類的成員看起來就像一個程序集變量,類的方法看起來就像程序集中的一個子程序。(注意,只是看起來像,它們之間還是有很明顯地區(qū)別的)3實例化實例化指的是從一個類到這個類的對象(實例),就像上面說的從“員工”到你們公司的小張。一個類并不是一個可操作的實體,它只是一個概念,只有對象才是可操作的,比如你們公司必須把薪水發(fā)放給具體的人(比如小張),而不是發(fā)放到抽象的“員工”或“銷售員”。在易語言中,生成一個類的實例對象(實例化)就是定義一個以這個類為數據類型的變量???/p>

5、以在通過點()來使用這個對象的方法,進而操作這個對象(類似于 調用“窗口1.移動()”來移動“窗口1”)。4繼承“電腦”、“員工”這兩個“類”雖然強大,概括了許許多多的“對象”,但是他們畢竟太寬泛了,有時候我們需要更具體一點的概念。比如別人問你,你家的那臺電腦是臺什么樣的電腦,你就絕對不會回答:“我家的那臺電腦是一臺電腦”,而是說出你的電腦的品牌,或具體的配置(比如一臺“戴爾8530電腦”或“一臺奔騰3電腦”)。同樣,你會對別人說,你們公司的小張是一個“銷售員”。前面提到的“戴爾8530電腦”和“銷售員”同樣都是類,但是他們分別比“電腦”、“員工”這兩個個類更加具體。這里你從“電腦”到“戴爾8

6、530電腦”和從“員工”到“銷售員”用的就是“繼承”,因為前面的每兩對概念中的后一個都具備了前一個的所有特征(比如“銷售員”肯定服務于某家公司并定期領取薪水),但是有都比前一個具有更多或更具體的特征(比如銷售員有具體的工作:負責銷售,“銷售員”的薪水可能比普通的員工要高一些)沒錯,編程語言中的繼承就是這樣的??偟恼f來,“繼承”指的是從一個相對比較寬泛的類到一個相對具體一點的類。在一個繼承關系中相對較寬泛的類被稱做后一個類的“基類”,相對較具體的類被稱做前一個類的“派生類”。當然,從這個相對較具體的類還可能會得出更加具體一點的類,這又是一個繼承關系,這時,這個“相對較具體的類”又成為了“更加具體

7、一點的類”的基類,后一個就是前一個的“派生類”,這樣的“具體化”還可能無限繼續(xù)下去。但是“繼承”絕對不能具體化到某個具體的“實體”也就是對象(比如從銷售員“具體化”到你們公司的銷售員小張),因為繼承只能發(fā)生在兩個“類”之間,一旦從類具體化到了對象那就不叫“繼承”了,就成了“實例化”。二牛刀小試1定義一個類,生成實例對象有了理論基礎,我們來牛刀小試一把!就以公司的員工為例子吧,打開易語言3.8新建一個窗口程序,插入一個“類模塊”,輸入如下代碼:本程序定義了一個類“員工”,這個類說明了所有公司員工的共同特性都有一個姓名(當然,員工的共同屬性肯定不止這些,這里為了簡單,僅僅考慮“姓名”)并給它定義了

8、一個文本型成員“姓名”同時提供了兩個公開方法用于操作這個成員。其中“取姓名”方法只是簡單地返回該類的唯一成員“姓名”;“置姓名”方法用于給“姓名”成員賦值。為了確?!靶彰背蓡T包含合法的姓名信息,程序在“置姓名”方法里加了參數合法性檢查。有了一個類,下面我們來進行“實例化”即從“員工”這個抽象的概念具體化到一個公司的員工張三。然后在啟動窗口上放置一個按鈕,并輸入如下代碼:這里的程序定義了一個“員工”類型的變量“張三”,也就從“員工”類實例化了一個對象“張三”。由于“張三”是“員工”類的對象,所以他就具有了這個類的所有成員和方法,然后我們就可以調用張三這個對象的兩個公開方法對它進行操作了。易語言

9、中所有的類成員均為私有成員,所以我們無法直接通過對象給它的成員賦值,只能通過調用公開方法(張三.置姓名 (“張三”))設置員工的姓名,而我們在“員工”的“置姓名()”方法中加了參數合法性檢查,所以實現(xiàn)了對類成員的保護。(其實這個保護是不完整的,如果沒有調用張三.置姓名(“張三”),這個員工還是沒有姓名的,即用“ 張三.取姓名() ”方法取得的為空文本,下面在講“_初始化”方法時將解決這個問題。)這里順便說一下類方法的訪問限制。一個類的方法可設置為“公開”或“受保護”,如果一個類的某個方法被“公開”就意味這這個方法可以被該類的其他方法、該類的實例對象和它的派生類訪問(即調用);否則,這個方法就是

10、“受保護”方法,受保護方法只能被該類的其他方法和它的派生類訪問而不能通過該類的實例對象來訪問。比如上面的“張三.置姓名(“張三”)”就是通過對象直接訪問類的公有方法。你可以試著把“員工”類的“取姓名()”公開 欄 的勾號去掉把它變成一個受保護方法,再運行該程序,易語言編譯器就會報錯:“錯誤(10123): 指定方法“取姓名”未被公開,不能在外部被調用?!笨磥砦覀兊囊渍Z言還是很聰明的哦。關于類方法在繼承中的訪問限制,我們將在最后面具體討論。注意:易語言中沒有類的公有(公開)成員,它的所有成員均為私有,所以,一個類的所有成員都只能在類的內部使用,而不能通過“對象名.成員名 = 值”的方式來直接訪問

11、類的成員。所以,如果你想把一個類的某個成員公開給外部使用,就必須給這個類添加相應的方法來取和置這個成員的值。2“_初始化” 與 “_銷毀”在上面的“員工”類的代碼中, 還有兩個方法我沒有提到,那就是這節(jié)的標題提到的那兩個方法。仔細研究一下,你會發(fā)現(xiàn)這兩個方法非常特別。第一:方法名都是以下劃線開頭;第二:它們都是“受保護”的;第三:它們都沒有返回值和參數;第四:這兩個方法是在我們插入一個類模塊時自動生成的。形式的特殊決定了它們功能的特殊。這兩個方法是“私有”的,即未公開的,也就是說它們只能在類內部使用。在什么時候使用呢?我們做個實驗,在這兩個方法中輸入如下代碼:更改“_按鈕1_被單擊”子程序如下

12、:然后運行調試運行這個程序,我們發(fā)現(xiàn)易語言是這樣輸出的:在彈出信息框之前:* 員工類 初始化* 張三.置姓名 ()* 張三.取姓名 ()彈出信息框之后:* 子程序即將結束* 員工類 銷毀我們可以發(fā)現(xiàn),“_初始化”是在“員工”類生成對象“張三”時被調用,“_銷毀”是在該對象超出作用域,將被銷毀時調用。由于“張三“對象是一個局部變量,所以它的作用域(生存周期)和它所在的子程序是一樣的,于是,在進入這個子程序后,執(zhí)行第一行代碼之前,“張三”就被創(chuàng)建,“_初始化”方法被自動調用;在這個子程序最后一行代碼執(zhí)行完畢即將退出時“張三”就被銷毀,“_銷毀”方法被自動調用。你也可以用類似的代碼驗證一下對象作為程

13、序集變量和全局變量使時的情況。另外,每生成該類的一個實例對象,該類的“_初始化”就被調用一次,每銷毀一個對象,該類的“_銷毀”方法就被調用一次(有點像窗口的“創(chuàng)建完畢”和“銷毀”事件)。你可以多招幾名員工(生成“員工”類的多個實例,即定義多個“員工”類型的變量)驗證一下哦。這兩個方法的這種特性在編寫程序時可以給我們很大的幫助,讓我們有機會在一個對象被創(chuàng)建時做一些初始化工作(比如打開一個文件,初始化類的私有成員),在這個對象被銷毀時,做一些善后工作(比如關閉打開的文件)。根據這種特性,我們可以改進以上的代碼,實現(xiàn)對“姓名”成員的初始化:更改“員工”類的“_初始化”方法代碼如下:這樣,就算沒有調用

14、 員工變量.置姓名 (“張三”) ,這個員工也會有一個名字(“未命名”)了,因為在這個員工被創(chuàng)建時,“員工”類的“_初始化”方法被自動調用了。人嘛,怎么能沒有名字呢。注意:不要更改“_初始化”和“_銷毀”方法的方法名、參數、返回值和訪問限制(即是否“公開”),否則易語言就會把它們當作普通的成員方法或報編譯錯誤。三一個更豐富的“員工”類為了更好地繼續(xù)我們的討論,首先我們應該把上一篇中的“員工”類豐富一下。這次除了可以設置和取出每個員工的姓名外,還要實現(xiàn)一個功能:計算月工資。為了簡單其間,我們假定月工資計算公式如下:“月工資 日工資 × 本月出勤天數” 。下面看看這在易語言中如何實現(xiàn)。打

15、開上次的那個例程中的“員工”類模塊,添加兩個成員:為了能存取這兩個私有成員,我們添加如下四個方法:注意:我這里把“置日工資”方法設置為“受保護”(即沒有公開),這樣當一個員工對象被創(chuàng)建出來后,就無法在外部對該員工的“日工資”進行修改了,比如“張三.置日工資(50)”是編譯不成功的。這樣才能保證公平性,每個員工的日工資都的一樣的,你想多掙錢,就要努力出滿勤(或成為一個銷售員,下面將繼承時,我們會發(fā)現(xiàn),銷售員的月工資還包括提成)。更改“_初始化”方法如下:在初始化時(每個員工對象被創(chuàng)建時)調用該類的“受保護”方法“置日工資”設置其日工資為30元。注意,雖然這個方法沒有公開,我們還是可以在這里調用,

16、是因為在易語言中,非公開的方法都是“受保護”的,是可以在類內部被其他方法(這里是被“_初始化”)調用的。(參看本篇開頭)然后,我們的主角出場了,計算月工資:這個方法很簡單,就是根據月工資計算公式計算出員工該月應得的工資并返回。這個類的使用也很簡單,比如公司新招聘了兩名員工“張三”和“李四”:到該發(fā)工資時,然后分別計算二人本月應得的工資:張三和李四中的任何一個都不能用過“置日工資”方法來更改自己的日工資,因為它是一個“受保護”的方法。四再說繼承上面我們提到,員工不能通過改變自己的日工資來提高收入,但是可以自己成為一個“銷售員”。我們假定銷售員的工資計算方式為“工資 日工資 ×出勤天數

17、銷售額 × 0.2”??梢钥闯?,銷售員也是員工,他除了具有所有員工都具有的姓名,出勤天數,日工資外,還多了一個“銷售額”屬性,并且工資計算方式也不一樣了。如果我們從頭寫一個“銷售員”類的話,我們得把上面“員工”類中除了“計算月工資”以外的代碼復制一份到銷售員類里,然后加上“銷售額”成員,和相應的存取方法,并編寫新的“計算月工資”方法。你有沒有發(fā)現(xiàn)這樣做我們的新類中有寫東西和以前的“員工”類有重復呢?這種重復除了無謂的浪費外還造成代碼的維護困難。面向對象正是要解決這個問題的??纯聪旅孢@個“銷售員”類是任何寫的:現(xiàn)在新插入一個類模塊:我們的“銷售員”類繼承÷自“員工”類,所以它

18、擁有了“員工”類的一切。雖然我們的“銷售員”類沒有“取姓名”、“置姓名”等方法,但是如果你實例化了一個“銷售員”類型的對象(變量)“銷售員1”,你同樣可以使用“銷售員1.置命名()”和“銷售員1.取姓名()”。這兩個方法從何而來呢?答案只有一個:從“員工”類繼承來的。這就是繼承的好處,我們不用重復編寫“銷售員”類的“取姓名”“置姓名”等在“員工”里已經寫好的方法了?!颁N售員”除了繼承了它父親“員工”的“遺產”外,也有自己獨有的成員“銷售額”和獨有的“置銷售額()”方法。如果只是繼承遺產而沒有創(chuàng)新,這繼承還有什么意思呢?下面我們集中看銷售員的“計算月工資”方法。首先它調用了“取出勤天數 ()”和

19、“取日工資 ()”這是“遺產”然后有和銷售額做了運算(這是創(chuàng)新)返回。問題是,它既然繼承自員工,并且繼承了員工的一切東西,那么它是不是也繼承了員工的“計算月工資()”方法呢?答案是“Yes”。第二個問題,那它既然繼承了員工的“計算月工資()”,它又有自己的“計算月工資()”,那它是不是有兩個“計算月工資()”方法呢?答案是“No!”。銷售員既然重寫了“計算工資()”方法,那么通過銷售員對象調用的“計算工資()”實際上執(zhí)行的是銷售員自己的“計算月工資()”。也就是說:如果派生類重寫了基類的某個同名方法,那么在這個派生類中,從基類繼承來的那個方法就被“覆蓋”掉了??聪旅娴睦樱哼@次李四如愿以償,成

20、了銷售員,雖然他的出勤天數和張三是一樣的,但是他又調用了自己的“計算月工資()”。于是,收入的差距就產生了。五類的多態(tài)性類的多態(tài)性表示:可以將一個繼承類對象賦予到其基類數據類型變量中,此時對此基類對象變量進行操作,將反映出繼承類對象的特性。本篇文章中的程序與前兩篇有很大的改動,為了解釋清楚類的多態(tài)性,現(xiàn)在在“員工”基類中增加一個空的“置銷售額”的方法,結構要一致。如下所示:再新增加一個新的名為“技術員”的類,其基類為“員工”類。如下所示:然后回到窗口程序集1中,添加一個“員工”類型的程序集變量“職工”,程序內容全部更改為以下所示:大家可以看出,本程序中將繼承類對象“技術員”和“銷售員”分別賦給

21、基類對象“職工”這樣,“職工”就有了繼承類對象的特性,在對銷售人員的操作時,“職工”的方法操作就等同于對銷售員繼承類對象的操作。大家也可以看出:基類“員工”有一個“置銷售額”方法,而繼承類“銷售員”里也有一個“置銷售額”方法,但當調用基類的“置銷售額”方法時,卻因為事先已被賦予了繼承類的對象,因此實際調用的是繼承類的方法。下面如果職工類型太多,也可以用數組循環(huán)的方法一次計算出來。下面是使用數組的例程序,可以看到也是將繼承類對象分別賦給基類對象,調用時使用數組操作分別調用基類。在此,只是簡單地使用數組說明,而沒有使用循環(huán)。實際上使用數組更能體現(xiàn)“類的多態(tài)性”的優(yōu)越性,因為如果繼承類很多的話,只需

22、使用一個循環(huán)就可以實現(xiàn)所有操作,非常方便。六虛擬方法實際上通過上述例程就可以了解什么是虛擬方法了。我為大家分析一下程序面板中類的定義,可以看到,基類“員工”中有一個“置銷售額”方法,繼承類“銷售員”中也有一個“置銷售額”方法,當子類變量賦值給父類變量后,可以達到覆蓋基類方法的目的。當然也可以定義一個抽象虛方法(純虛函數),即一個空方法,只提供方法的框架而不編寫任何代碼,實現(xiàn)的過程完全通過子類的覆蓋來實現(xiàn)。虛擬方法,又稱為虛函數,是一種虛擬出的方法,其他編程語言中通過“virtual”關鍵字來定義虛函數。虛擬方法就是允許被子類重新定義父類的方法,這就是常說的函數的覆蓋(overload)。基本上面向對象是模仿了人類的認知世界,在編寫一個大型而實用的程序時,使用對向對象的創(chuàng)作手法要比傳統(tǒng)的編程手法有效。如果程序需要改動,也只是需要將某一部分的方法改變,從而無需將程序的所有環(huán)節(jié)改變。在面向對象的程序設計之前,必須事先作好類的規(guī)劃,使得程序更加清晰,去除重復性的勞動,代碼的維護也不再困難。七總結前述簡單講解了易語言支持類的構造、析構、繼承、虛擬方法、多態(tài)、封裝特性。下面再歸納一下,以加深大家對這些概念的理解。(1)對象的構造:構造順序為:先構造基類對象,再構造其繼承類對象

溫馨提示

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

評論

0/150

提交評論