国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VB.Net中文教程(8) 對象(Object)基本概念

2024-07-10 13:02:43
字體:
來源:轉載
供稿:網友
主題: 對象(object)基本概念

???????????? 內容 ????????????
v 1. 何謂「對象導向」?
v 2. 認識與尋找對象
v 3. 對象之分類與組織
v 4. 類別之設計
v 5. 對象之行為
v 6. 訊息與運算
v 7. 類別之定義
v 8. 著手寫 vb程序

大地運轉、花開花謝、及楓葉飄零 ...... 是自然界對象之行為。對象行為交互作用﹐造成多采多姿的大自然。軟件的對象是自然界對象的抽象表示,軟件就逼真地表達自然界的實際景象﹐于是人們心中構思的軟件和眼中所見到的世界是一致的。軟件是自然界實況的抽象﹗簡單明了﹐能幫助人們了解和掌握真實景物。本文介紹vb的對象觀念,讓您輕易以vb描述身邊美麗多變的世界。 ----- 摘自 高煥堂 的文章

1. 何謂「對象導向」﹖

在企業上常有「行銷導向」及「技術導向」之名詞﹐行銷導向講得更通俗一點就是行銷掛帥﹐亦即行銷觀念為整個企業營運計劃之核心。而技術掛帥就是以技術創新為公司活動之核心。同樣地﹐在軟件開發方面﹐傳統 c語言之核心觀念是「函數」(function)﹐進而讓函數之間可互相呼叫并傳遞數據。在 cobol程序中﹐大部分的程序設計工作擺在 cobol程序的程序部(procedure division)中﹐進而讓段(paragraph) 之間互相呼叫(perform) 。當您看到 c程序時﹐腦海里充滿著函數的影子﹔當您想到 cobol程序時﹐心理也充滿段、節等觀念﹐就像我們想到或看到萬里長城時﹐馬上聯想到它是由許多石塊所構成一般。因之﹐傳統的程序設計是「函數導向」(function-oriented) 或稱為「程序導向」(procedure-oriented)﹐著重于計算機處理資料時的執行過程。
后來﹐資料導向觀念出現了﹐資料在經過程序的處理后會有所改變﹐這轉變的途徑﹐成為軟件設計過程中﹐注意力的集中點﹐這稱為「數據導向」(data-oriented) 。
現在的「對象導向」(object-oriented) 觀念﹐在軟件開發時﹐甚至寫程序時﹐對象(object)成為腦海里的主角。當您看到程序時﹐心理充滿著對象之影子和概念﹐函數和資料變成對象內之一部分﹐是配角而非主角了。程序設計之核心工作在于描述對象、組織對象、安排對象間之溝通(傳遞訊息)方式。就如同「人」是社會中的主要對象﹐社會是有組織的人群﹐人們之間會互相溝通、協調。
由于軟件中的對象觀念和實際社會中的對象觀念是一致的﹐所以 oop觀念使軟件與實際世界間之距離縮短了。此為 oop技術的重要特點之一。例如﹕函數或程序導向之核心觀念──函數﹐在一般人們的心目中﹐并非熟悉之概念﹐只在數學里學到之概念而已。因而讓人對軟件感到陌生。而在對象導向觀念中﹐實際社會之對象﹐例如﹕人、汽車、股票、磁盤驅動器、帳單、房間、學生、教室等皆為軟件設計師腦海中的對象﹐也是程序中的對象。因之﹐不論是老板或程序設計師來看程序﹐他們腦海中皆充滿對象之影子﹐而這些個體皆為人們生活中﹐真正活生生的東西、實在之物體或大家耳熟能詳之概念﹐使得軟件之使用者和設計者有一致的心靈、共同之感覺﹐這讓使用者對軟件更滿意﹐設計師更了解使用者之需要。


2. 認識與尋找對象
著手設計一個系統或寫一個程序時﹐第一件會出現在腦海中的問題是﹕對象那么多﹐何者是跟此系統或程序有關的呢﹖例如﹕在設計一個銷售系統時﹐「顧客」是一重要對象﹐產品及訂單也是重要對象﹔至于原料之產地及原料之供貨商雖然是明顯的對象﹐但不見得與銷售系統有關。反之﹐若您所設計的是采購或生產系統時﹐原料、產地及其供貨商就躍然成為重要對象了。在尋找對象之過程中也會讓您對所要設計的系統有更清楚之認識。
現在就來介紹較實用之找對象方法。其中最常見的是﹐從有關文件著手。在文件里會發現下述線索﹐再進而找出對象。
(1) 人(people)──人是任何系統之重要角色﹐通常是最容易找到之對象。例如﹕公司有 5位銷售員﹐各負責一個地區的任務﹐并與該區的顧客連絡。從這段敘述中﹐就可發現兩種對象──銷售員及顧客﹐每一位銷售員皆是對象﹔同樣地﹐每一個顧客皆是對象。
(2) 地方(sites) ──地點是很容易發現之對象。例如﹕您從訂單上看到產品將送達之目的地、顧客之所在地。再拿旅行社行程來當例子﹐各旅行團將于不同之觀光地區停留﹐各觀光地點皆是對象。
(3) 事物(things)──在可摸到或看到的實物中﹐也容易找到與系統有關之對象﹐例如﹕產品是銷售系統及生產系統之明顯對象﹐原料項目是生產及庫存系統之重要對象。就旅館管理系統而言﹐「房間」是重要對象。「書本」及「雜志」為圖書館或書店管理系統之明顯對象。
(4) 事件(events)──在企業界最常見之事件是「交易」﹐當事件發生時﹐我們會去記錄它發生的時刻、有關金額等等。這種我們所關心的事件也常是重要之對象。值得注意的是﹐這些事件是已發生的﹐其為一項行為或動作。所以在文件中﹐常是一個句子的動詞。例如﹕今天共有 3種原料已降至安全存量之下﹐所以共訂購 3種原料。這每一「訂購」(ordering)事件皆是對象。就飛機場的控制系統而言﹐每次飛機「起飛」或「降落」 皆是重要對象。而「提款」及「轉帳」皆為銀行系統之重要對象。「掛號」及「就診」為醫療系統之對象。
(5) 概念(concepts)──與企業營運或機構管理有關之「構想」或各種「計劃」或其它觀念﹔這些無形的﹐但決定企業活動之構想﹐常是重要對象。例如﹕公司正擬定三種廣告策略﹐其中每一策略就是企業行銷系統之重要對象。這公司正透過 2種管道與社區居民溝通﹐這管道也是概念性之對象。
(6) 外部系統或設備(external systems or devices) ── 軟件系統常會與其它系統溝通﹐互相交換信息。有時也由外部設備取得交易資料或把處理結果送往外部設備。這些外部系統或設備也是對象。例如﹕庫存系統與采購系統會互相溝通﹐對庫存系統而言﹐采購系統是對象﹔反之﹐對采購系統而言﹐庫存系統則為對象。如果收款機直接把交易資料傳送給銷售系統﹐則收款機是此銷售系統之對象。如果股票系統直接把資料傳送到交易市場的電視顯示屏上﹐則對股票系統而言﹐電視顯示屏是對象。
(7) 組織單位(organization units)──企業機構之部門或單位。例如﹕在學校管理系統中﹐教務處及訓導處等單位皆是對象。
(8) 結構(structures)──有些對象會包含其它對象。所以在對象中常能找到其它對象。例如﹕在學校的組織單位──教務處﹐含有小對象如注冊組及學籍股等。在汽車對象中可找到引擎、輪胎及座椅等對象。在「房屋」對象中﹐會發現到廚房、客廳、沙發等對象。

以上介紹的是常用之尋找對象方法﹐會尋找對象之后﹐就必需將對象分門別類﹐并且了解類別間之關系﹐以便把它們組織起來。例如﹐在公司的人事結構中﹐可發現人因扮演角色之不同而分為不同種類之對象﹐如推銷員、司機、經理等等。汽車可分為跑車、巴士、旅行車等不同種類之對象。如何分類(classification)﹐是oop 之重要觀念。


3. 對象之分類與組織
3.1 類別的永恒性
俗語說﹕物與類聚。「物」和「類」說明對象與其所屬「類別」(class) 之關系﹐相似之對象常歸為一類。例如﹕一個人是對象﹐人類是由個人所構成之類別。「狗」這種動物是類別﹐我家那只哈巴狗是對象。當您獲知公司有 a、b 兩位推銷員時﹐可得知 a、b 兩者皆為對象﹔同時﹐也聯想到「推銷員」(salesman)是類別﹐而 a、b 皆是此類別內之對象。
由于類別比對象較具有永恒性﹐在設計軟件的過程中﹐當您找到對象時﹐也必須掌握此對象之類別﹐如此軟件自然會更具有永恒性﹐亦即軟件的壽命會更長。例如﹐一個人從出生到老﹐不超過二百年﹐而「人類」則因對象生生不息而永遠昌隆。在學校里﹐king老師會換工作而離開學校﹐但「老師」類別將永遠存在。因之﹐個體及其所屬的群體──類別﹐皆是 oop之核心觀念。善于利用類別把對象歸類﹐并且組織起來﹐是對象導向軟件開發的重要技術。在設計軟件時﹐通常必須先決定有關的類別﹐并且弄清楚類別之間的關系。茲介紹兩種最常見之類別關系﹕「父子關系」和「整體╱部分關系」。

3.2 父子類別關系
人們從小就學習對東西分類﹐將東西分為「生物」及「無生物」﹐其中生物又分為「動物」及「植物」等。無論動物、植物或生物皆為類別(class) 。動物是一種(a kind of) 生物﹐植物也是一種生物。此時﹐即稱動物是生物的子類別(subclass)﹐植物也是生物的子類別﹐而生物是動物及植物的父類別(superclass)。這種父子類別關系是軟件中的組織相關對象的重要方法。例如﹕汽車、馬車、腳踏車皆為一種車﹔所以﹐車是父類別﹐而汽車、馬車及腳踏車皆為車之子類別。
設計軟件時﹐當您知道公司今天生產 5部巴士及 5部轎車時﹐您已找到10個對象了﹐其中每一部車皆為對象。它們分別屬于不同類別──巴士及轎車﹔然而﹐因巴士及轎車皆為一種(a kind of)汽車﹐所以輕易地找到其更大的類別──汽車。利用父類別──汽車把兩個子類別──巴士及轎車組織起來﹐其關系可表示如下:


圖1 父子關系

于是﹐在我們所設計的軟件中﹐將包含這三種類別。
日常生活中﹐父子關系是很常見的類別關系﹔經由這種關系﹐也很容易決定與軟件有關的類別。例如﹕一家公司正在生產 3種鞋子──網球鞋、籃球鞋及慢跑鞋。此時我們已找到了 3種類別──網球鞋、籃球鞋及慢跑鞋。由于網球鞋及籃球鞋皆為一種球鞋﹔所以﹐進而找到父類別──球鞋。球鞋及慢跑鞋皆為一種鞋子﹐所以又找到了它們的父類別──鞋子。因之﹐得到關系如下﹕

圖 2 多層父子關系

如果為這家公司設計軟件﹐這 5種類別是軟件中的重要類別﹐同時這種父子類別關系﹐正是軟件用來組織有關對象(各雙鞋子)的好方法。由于軟件設計者的腦海中﹐對象的組織方法和一般管理者腦海中的分類方法是一致的﹐這能使軟件更適切地滿足使用者的需要﹐也提高了軟件的價值。

3.3 整體╱部分關系
上節談過﹕對象常包含其它對象﹐從對象之結構(structure) 能找到其它對象。例如﹕一部汽車含一個引擎及 4個輪胎。


圖3 對象之整體╱部分關系

從這對象結構﹐發現到兩類別──引擎及輪胎。其類別關系為﹕


圖4 類別之整體╱部分關系

引擎是汽車的一部分(a part of) ﹐輪胎是汽車的一部分﹐所以汽車是「整體」(whole) ﹐而引擎及輪胎是「部分」(part)。
在實際的產品結構中﹐常見整體╱部分關系。例如﹕燈泡含燈心、燈帽及玻璃球﹔書本含封面、目錄及內容等部分﹔計算機系統含屏幕、鍵盤、主存儲器及磁盤驅動器等等。在軟件設計時﹐也常依照這結構來組織類別及對象。例如﹕在程序中﹐就可定義汽車、引擎及輪胎三種類別。
請注意﹕上述關系﹐其整體與部分間有共生共滅之密切關系。例如﹕一個燈泡破了或者燒壞了﹐通常整個燈泡﹐包括其內部的燈帽、燈心、玻璃球一齊都被丟棄了。于是﹐在軟件系統中﹐這些部分對象(如燈心)皆會隨著整體對象(燈泡)之消失而一起消失了。反之﹐司機對汽車而言是不可或缺的﹐但沒有人認為司機是汽車的組件﹐原因是一部汽車報銷了﹐司機可還存在呢﹗然而﹐司機仍是汽車的一部分﹐因為在空間上﹐汽車對象中﹐仍包含了司機對象。因之﹐汽車與司機之間仍是整體╱部分關系。



這種關系也很常見﹔例如﹕筆心是自動鉛筆的一部分﹐但筆心并不與鉛筆共生共滅。同樣地﹐干電池是手電筒的一部分﹐但兩種對象并非共生共滅。這種整個╱部分的關系﹐也讓我們很容易找出相關的對象和類別﹐同時也能利用這種關系來把軟件中的對象組織起來。
上述兩種關系是實體物之間的整體╱部分關系。然而在概念性的對象或類別之間也常見整體╱部分關系﹔這些經常是企業活動或計劃之概念性對象。例如﹕在旅行社中﹐旅行團的行程常分為數段﹐每一段行程是總行程的一部分。



由于企業營運計劃常為企業管理的核心工作﹐而計劃或活動經常由數個更小的計劃或活動所構成。所以在 oop技術中﹐常用整體╱部分關系來表示這種概念性類別之關系。
再從企業機構的組織來看﹐一個組織(organization)經常有其成員(member)﹐這組織與成員之間也是整體╱部分關系。例如﹕一個公司分為數個部門﹐每一部門又數個職員﹐則部門是一組織﹐而職員是該組織的成員﹔亦即﹐部門與職員是整體╱部分關系。



由于公司包含數個部門﹐所以公司與部門之間也是整體╱部分關系。此外﹐職員也是公司的成員﹐所以公司與職員之間也是整體╱部分關系。



由于組織與成員之間關系是府拾可得之整體╱部分關系﹐極為常見﹔因之﹐經由這種關系可找到有關之對象及類別。在設計軟件時﹐可別忘了掌握此重要關系。事實上﹐軟件也應表達出這種關系﹐才能使得軟件中的對象結構與實物世界中的對象結構一致。
在對象導向程序設計之過程中﹐通常先于程序中定義有關之類別﹐再利用已定義之類別來誕生對象來與實物世界中的對象相對應﹐以便讓軟件更貼切地表示實際的系統之需求。因之﹐在找到對象之后(其方法如上節所述)﹐就確定它們的所屬類別。確定了這些基本的類別之后﹐就經由「父子關系」找出有關的父類別或子類別﹐并且確定這些類別之間的關系。再接下來﹐就是利用對象之間的整體╱部分關系﹐來找出相關的對象﹐并進而找出相關之類別﹐并且確定這些類別之間的關系。
本書里﹐將以 vb.net語言來說明如何運用類別來組織對象﹐并像建造萬里長城般有系統地將對象組織起來﹐形成既可靠又好用的現代軟件。



4. 類別之設計

對象導向程序設計(object-oriented programming 簡稱 oop)之觀念能大量簡化計算機軟件之復雜度﹐讓人們更容易發展及維護軟件。oop 的兩個最基本觀念是﹕類別(class) 及對象(object)。俗語常說﹕「見樹不見林」或「見林不見樹」﹐其中的林就是「類別」﹐而林之組成元素──樹就是「對象」了。依傳統之程序寫法﹐主要之程序設計工作是在于設計指令、敘述及函數等等﹔然而在oop 之新觀念中﹐寫程序的主要工作在于──設計類別﹐亦即「造林」之工作。設計各式各樣之類別后﹐再做「雕材」的工作﹐對樹木做各種運用﹔亦即﹐使用類別之對象﹐而產生有價值之信息。請看如何設計一類別叫──tree(樹林)﹐其格式為﹕

class tree
品種
年齡
高度
end class

此告訴計算機﹕對于樹林中的樹﹐將記錄其 3種特性(attribute) ──品
種、年齡及高度。例如有一棵樹﹐其特性為﹕

品種﹕peach
年齡﹕8 年
高度﹕2.1 尺

這是樹林中的一棵樹﹐在計算機的tree類別中﹐就必須有一「對象」(object)和它對應并且儲存它的特性。至于如何產生tree類別之個體呢﹖其指令為﹕

dim x as new tree()

此時計算機就誕生對象 x。x 能儲存此樹之資料如下﹕


如果您想記錄別棵樹之資料﹐可再宣告tree類別之對象如下﹕
dim y as new tree()

對象 y就可儲存此樹的資料了。實物上之關系﹕
樹林 <----> 樹

樹林是一個集合(set),一棵樹是集合里的元素。其表現于計算機程序上是﹕
類別 <----> 對象

類別是一個集合,一個對象是集合里的元素。
此為 oop之基本觀念。類別設計之優劣常決定軟件之生命和價值﹐好的設計其軟件壽命源源流長﹐價值連城。類別之設計并非到此為止﹐還要繼續做一項重要工作──分類(classification)﹐亦即尋找「子類別」(subclass)。例如﹕上述樹林中的樹若可分為兩種──果樹與竹子﹐則「樹林」類別可分為兩個子類別──「果樹」與「竹子」。


圖5 類別之細分(refine)

此為實物上之類別關系。程序中的類別關系必須和實物上的情況相呼應。程序中的類別宣告格式為﹕

class tree
品種
年齡
高度
end class

class fruittree
inherits tree
成熟月份
價格
end class

class bamboo
inherits tree
用途
end class

其中﹐fruitttree及bamboo是tree之子類別(subclass)﹔而tree是fruittree及bamboo之父類別 (super class)。于程序中﹐其關系表示如下──

class 類別
inherits 父類別

fruittree類別中含有兩項新特性──「成熟月份」及「價格」。這告訴計算機說﹕對于果樹﹐必須多儲存兩項資料。這兩項資料是果樹才有的﹐竹子就沒有。bamboo類別中含有一項新特性﹐這告訴計算機說﹕對于竹子﹐必須多儲存一項資料──「用途」。這是竹子才有的資料﹐果樹則無。例如﹕有一棵果樹﹐其資料為﹕

品種﹕peach
年齡﹕8 年
高度﹕2.1 公尺
成熟月份﹕3 月
價格﹕20 元

在計算機中﹐必須宣告fruittree類別之對象來儲存這些資料。欲產生此對象﹐程序可寫為﹕
dim a as new fruittree()

此時計算機就產生一個fruittree類別之對象﹐叫 a。它包含5項資料──


其中包含了tree類別內之 3項資料以及fruittree類別專有之兩項資料。因為tree為fruittree之父類別﹐所以fruittree「繼承」(inherit) 其父類別tree的 3個特性。


圖 6 資料的繼承

同理﹐如果有一棵竹子﹐其資料為﹕

品種﹕green
年齡﹕2 年
高度﹕10.0 公尺
用途﹕chopsticks

在計算機中﹐必須宣告bamboo類別的對象來儲存這些資料。欲產生此對象﹐程序可寫為﹕ dim b as new bamboo()
此時﹐計算機就誕生一個bamboo類別之對象 b。它可儲存 4項資料──


其繼承(inherit) 了tree類別之 3個特性。


圖7 資料的繼承

父類別tree內之資料為子類別── fruittree 和bamboo都具有之共同特性。此為oop 類別設計之基本原則。



5. 對象之行為

樹林中的樹會長高或變矮(遇臺風等)﹐計算機中儲存這些資料之對象必須隨之改變﹐即對象內之資料會改變。果樹的果實售價改變了﹐fruit_tree類別之對象也須改變﹔這種對象內資料之變化是對象(object)之「行為」(behavior)。對象之基本行為包括﹕
(1)把資料送入對象并儲存起來。
(2)改變對象內之資料。
(3)拿對象資料來做運算。
(4)從對象中送出資料。

例如﹕30公斤peach之總金額為何﹖此時﹐可拿對象a內之價格資料來做運算──


我們的目的是要拿對象 a中的價格資料(20元)和重量(30公斤)相乘﹐進而算出其總金額(600 元)。然而在oop 的觀念中﹐則必須將其解釋為──「把 30 送進對象 a﹐在對象內部做相乘運算﹐然后把總金額 600送出來。」 其中﹐ 600是對象 a接受到外界的「訊息」(message) 之后﹐才做出的反應﹐至于它的反應過程(乘法運算)則是在對象 a內部完成的。就如同一個電燈泡﹐當電流進入燈泡中﹐此燈泡會發出亮光。這是人們日常府拾可得之經驗﹐如果計算機軟件像燈泡一樣一點就亮﹐不知可多得若干人的芳心呢﹗當你到臺北火車站買車票時﹐只需把錢投入售票機中﹐經過一些處理之后﹐就有反應﹕把車票吐出來。


上述之實物對象(如自動售票機)接到訊息(message) 時﹐其內部產生運作﹐并輸出運作之結果。同樣地﹐程序內之對象(object)接到訊息時﹐其內部也對資料做運算﹐并輸出運算結果。例如﹐想知道 peach樹之高度為何﹖可將此訊息送進對象 a中﹐它會輸出此樹之高度。


對象對訊息會產生反應﹐但并非對任何訊息都有反應。例如﹕燈泡只會對電流有所反應──發光。自動售票機必須投入錢才會有反應──送出票來。如同一只貓﹐它對一個身邊的饅頭可能不會有反應﹐但對身旁的老鼠將會出現強烈之反應。
當我們使用燈泡或自動售票機時﹐能輕易學會其使用方法──知道輸入什么訊息﹐也很清楚它們的反應。類似地﹐在oop 程序中﹐你也能輕易學會對象(object)的使用方法──知道輸入什么訊息﹐及了解其反應。所以﹐使用程序內之對象﹐就像使用燈泡一樣的簡單方便。
換個角度來說﹐如果您是自動售票機之設計人﹐就須負責設計機內之處理過程(反應過程)﹐并使輸入訊息更簡單﹐而反應更清楚。同理﹐如果您是對象之設計師﹐就得負責設計對象內之運算過程(對訊息的反應過程)﹐并使輸入訊息更簡單﹐而反應更清楚。


6. 訊息與運算

如果您是手表之設計人﹐則需把電池放入手表中以提供電力。此時﹐您既使用現成之對象──電池﹐也創造新對象──手表。同樣的情況﹐寫計算機程序時﹐您經常是對象之使用人﹐亦為對象之設計人。因之﹐利用既有而完美之對象去創造更有用之對象﹐乃為oop 程序員的天職。設計手表時﹐您心理必定很清楚這新手表會有何功能﹐譬如﹕如何設定時間、表示時間(指針或數字)等等。也就是說﹐您一定對這手表將呈現之「行為」(behavior)有很清晰之構想。其行為包括﹕

(1) 它接受何種「訊息」(message) ﹖例如﹕按鍵輸入時間。
(2) 對訊息將會有何反應﹖例如﹕顯示時間或日期等。

在我們周遭之實物世界中﹐各物體都有其固定之行為﹐所以我們能輕易掌握它﹐且覺得可愛。例如抽煙者常攜帶的打火機﹐只當用力按它時才有火苗出現﹔一顆手榴彈也在某種動作下﹐才會引爆﹐否則您一定不敢用打火機﹐面對敵人時也不敢用手榴彈。
設計程序中的對象時﹐也得設計它的「行為」﹐決定它將接受何種訊息﹐并且對訊息會產生何種反應。然因您是設計人﹐所以有項必須擔任之工作──設計對象內部之運作﹐使它對訊息產生正確的反應。就像您組織手表內部之零件、打火機內部之結構以及手榴彈內部之引爆過程等等。這就是對象設計者之主要工作﹐其目的是﹕讓別人有個好用而易于掌握之對象﹗
以前設計vb程序時﹐在我們心中ㄉ主角是「函數」(function)或「子程序」(subroutine)。現在就得把函數擺入對象中﹐讓對象有所行為──對訊息有所反應。當您對所設計之對象的行為有清晰的構想之后﹐就自然知道應將那些函數置于對象中。就如同設計手表者依手表的功能決定應有那些零件一般。您去購買現成的零件、創造零件、選擇適當的電池﹔接下來就將這些零件組織于手表內。寫程序時﹐您使用既有之函數(例如﹕vb 已提供之函數)、創造新函數、也利用既有之對象﹔接下來就將這些函數和對象組織于新對象之中。
至于應如何組織這些函數﹖如何運用現成之對象﹖即為本書之主題了。現在請回到tree類別之例吧﹗上節里﹐已經誕生對象 a如下﹕



接下來﹐可設計一個函數叫computeamount(weight)﹐它能求算總金額。如果把這函數加入對象a 中﹐那么對象a 就有如下反應──



如果另設計個函數叫 inquireheight() ﹐并將之加入對象 a中﹐則對象 a就能輸出樹之高度﹕



這如同設計燈泡者將鎢絲及稀有氣體放入其中﹐燈泡才會發光。至于燈泡之使用人就不必為燈泡內部的東西及運作過程而傷腦筋了﹔因之﹐人們會喜歡使用燈泡。燈泡把材料和反應之過程「封藏」(encapsulate) 于燈泡內﹐您只需把電流(訊息)傳入燈泡(對象)中﹐它就發出亮光(反應)。
寫程序時﹐您把函數擺入對象中﹐對對象內之資料做運算﹐并且輸出結果﹐此時函數內之指令擔任這項運算工作。由于函數存于對象內﹐而資料之運算進行于函數內﹔所以﹐運算的過程(亦即反應的過程)就被「封藏」于對象之內。對象之使用人不必為這些函數之運算而傷腦筋﹐也就覺得對象是簡單好用。如果計算機軟件是由對象組織而成﹐人們就會覺得軟件是既簡單又好用。就像燈泡可裝在車子上﹐也可裝在房子內﹐裨構成更大之對象(車子、房子都是對象)。此程序設計觀念﹐就稱為「對象導向程序設計」。
假設您已把computeamount(weight)及inquireheight()兩個函數加入對象 a中﹐就可把訊息送給對象a ﹐指令可寫為﹕
a.computeamount( 30 )

這意思是﹕把訊息──computeamount(30)送給對象 a。此時對象a 內部之computeamount()函數就會進行運算(把 30 和 20 乘起來)﹐并且送出總金額 600元。您可輸入另一訊息﹐指令為﹕

此時﹐對象 a內之inquireheight()函數就會進行運算(讀取高度── 2.1)并且送出該樹之高度﹐亦即 2.1公尺。看看較完整的vb程序吧﹗

protedted sub form1_click( .... )
dim amount as double
dim height as double
dim a as new fruittree( "peach", 8, 2.1, 3, 20 )
amount = a.computeamount( 25 )
height = a.inquireheight()
messagebox.show("amount= " + str(amount) + "height= " + str(height))
end sub

此程序中﹐對象 a首先接到一訊息──computeamount(25)﹐對象a 就會激活其內部的computeamount()函數﹐此函數就拿25和對象中的價格20相乘﹔函數計算完畢得到 500﹔對象 a就將其送出來。


計算機再將 500存入amount變量之中﹐則amount之值是 500。接下來﹐對象 a又接到另一訊息──inquire_height()﹐對象 a激活其內部的inquire_height()函數﹐此函數就讀取對象內的「高度」──2.1 ﹔且把 2.1送出來。


計算機將 2.1存入height變量之中﹐則height之值為 2.1。最后﹐計算機把amount及height變量之值顯示于屏幕上──
amount = 500 height = 2.1


7. 類別之定義

一只貓是對象(object)﹐不同的貓其大小、顏色各不相同﹐但是它們有很多相同之行為﹐您才認為它們是貓﹐也才將它們歸于同一類﹔譬如喜歡捉老鼠、善于爬樹、怕水等等。因之歸于同類別之對象具有共同的行為(behavior)﹐亦即各對象對訊息(message) 之反應過程是相同的﹐這反應過程可由同一函數擔任。例如﹐下述指令產生 a及 k兩對象──

dim a as new fruittree("peach", 8, 2.1, 3, 20)
dim k as new fruittree("pineapple", 2, 0.5, 6, 10)

假設其內部資料為﹕





因 a及 k是同類別之對象﹐所以對同一種訊息的反應過程是一樣的﹔但由于對象內部的資料并不相同﹐其反應的結果有所不同。









對于訊息──computeamount(25)而言﹐對象 a會激活computeamount()函數處理它﹔而對象 k也激活computeamount()處理它﹐其處理過程是相同的。也就是說﹐對象 a和 k共享computeamount()函數來處理這訊息。此computeamount函數可寫成﹕



function computeamount(重量)
computeamount = 重量 * 價格
end function

于是﹐把這函數加入fruittree類別中──

class tree
品種
年齡
高度
end class

class fruittree
inheits tree
成熟月份
價格
function computeamount(重量)
computeamount = 重量 * 價格
end function
end class

class bamboo
inherits tree
用途
end class

如此﹐fruittree類別之各對象都對computeamount(25)訊息有所反應﹔各對象皆使用這computeamount()函數來處理此訊息。您可認為各對象共享computeamount()函數﹐也能認為每對象內皆有一份computeamount()函數﹐以便處理這種訊息。接下來﹐繼續將inquireheight()函數加入fruittree類別中──

class tree
品種
年齡
高度
end class

class fruittree
inherits tree
成熟月份
價格
function computeamount(重量)
computeamount = 重量 * 價格
end function
function inquireheight()
inquireheight = 高度
end function

class bamboo
inherits tree
用途
end class

于是fruittree類別之對象具有同樣的行為──對computeamount()和inquireheight()訊息有所反應﹐且反應過程也相同﹐只是反應結果有所不同。寫程序時﹐可認為fruittree類別之對象共同享用computeamount()及inquireheight()函數。也可認為各對象內﹐各有一份computeamount()函數及一份inquireheight()函數﹐以便處理這兩種訊息。






請看個主程序﹕

protedted sub form1_click( .... )
dim amount as double
dim height as double
dim a as new fruittree( "peach", 8, 2.1, 3, 20)
dim k as new fruittree( "pineapple", 2, 0.5, 6, 10)
amount = a.computeamount( 25 )
height = a.inquireheight()
messagebox.show("amount= " + str(amount) + "height= " + str(height))
amount = k.computeamount( 25 )
height = k.inquireheight()
messagebox.show("amount= " + str(amount) + "height= " + str(height))
end sub

因fruittree類別含有computeamount()及inquireheight()兩函數﹐所以對象 a及 k皆能接受這兩種訊息﹐并處理之。至于其它的訊息﹐因無函數來支持(處理)﹐fruittree之對象無法接受之。您可繼續把新函數加入fruittree類別中﹐使其對象擁有更豐富之行為﹐亦即能接受更多樣化之訊息。換句話說﹐對象之功能就更多了。上述程序輸出如下﹕

amount = 500 height = 2.1
amount = 250 height = .5
8. 著手寫 vb.net程序

上節之主程序中﹐我們是假設對象 a及 k之內部已有資料了。也許您想問道﹕如何把資料存入對象內呢﹖很簡單﹗當您有這種需要時﹐就設計一個函數﹐并加入類別中﹐由它擔任資料的輸入工作。資料輸入對象中﹐也是對象之行為﹐一旦您將此函數加入類別之后﹐對象就能接受訊息﹐并且處理它。以下的實際vb程序﹐讓您了解詳細的情形了。這程序叫oop01-01:

'ex01.bas
imports system.componentmodel
imports system.drawing
imports system.winforms
'-----------------------------------------------------------------
class tree
public varity as string
public age as integer
public height as double
end class

class fruittree
inherits tree

public month as integer
public price as double
public function computeamount(byval weight as single) as double
computeamount = weight * price
end function
public function inquireheight() as double
inquireheight = height
end function
public sub setprice(byval pr as double)
price = pr
end sub
public sub setheight(byval hei as double)
height = hei
end sub
end class

class bamboo
inherits tree

public usage as string
end class
'-----------------------------------------------
public class form1
inherits system.winforms.form

public sub new()
mybase.new()
form1 = me
'this call is required by the win form designer.
initializecomponent()
'todo: add any initialization after the initializecomponent() call
end sub
'form overrides dispose to clean up the component list.
public overrides sub dispose()
mybase.dispose()
components.dispose()
end sub
#region " windows form designer generated code "
.......
#end region
protected sub form1_click(byval sender as object,
byval e as system.eventargs)
dim a as new fruittree()
dim k as new fruittree()
a.setprice(20)
a.setheight(2.1)
k.setprice(10)
k.setheight(0.5)
dim amount as double
dim height as double

amount = a.computeamount(25)
height = a.inquireheight()
messagebox.show(str(amount) + "元 , " + str(height) + "公尺", "結果")
amount = k.computeamount(25)
height = k.inquireheight()
messagebox.show(str(amount) + "元 , " + str(height) + "公尺", "結果")
end sub
end class

當您把這程序輸入計算機﹐并利用vb執行它﹐則計算機輸出結果如下﹕

500元, 2.1公尺
250元, .5公尺

請注意﹕這程序中有數個public專用字﹐此刻您不要為它們而傷腦筋﹐此后各章將詳細說明之。現在您必須了解之重點是﹕

(1) 如何表明您所設計之類別﹐以及類別之間的父子關系。
例如﹐類別關系是﹕


在程序里﹐從上層類別開始﹐依照由上而下之順序逐一把各類別敘述清楚。各類別所屬之數據項(變量)﹐也得說明清楚。

(2) 如何把函數加入類別中﹐以支持對象之行為﹐使對象能接受訊息、進行運算并輸出結果。
例如﹕fruittree已加入 4 個函數﹐使得fruit_tree類別之對象能接受并處理 4種訊息。


為了讓對象能接受并處理訊息﹐必須把適當的函數加入類別中﹔因之﹐類別內含有兩種重要成份──

1.數據項
2.函數

我們稱這數據項為類別之「資料成員」(data member) ﹔并稱這函數為類別之「成員函數」(member function)。例如:fruittree類別含兩個資料成員──

成熟月份
價格

fruittree類別含 4個成員函數──

computeamount()
inquireheight()
setprice()
setheight()

(3) 如何產生對象。
如果您把類別視為一種資料型態(data type )﹐那就輕而易舉了。想產生兩個fruittree類別之對象﹐就寫指令如下﹕

dim a as new fruittree()
dim b as new fruittree()

能以兩種方法了解上述之指令﹕

1. 把fruittree視為類別﹐則a, k就是對象﹔則此指令就宣告兩個「對象」(object)。
2. 把fruitttree視為一種資料型態(data type) ﹐則 a , k 就是fruittree型態之變量﹔則此指令宣告兩個「變量」(variable)。

綜合上述兩種看法﹐您可認為﹕fruitttree是一種「型態」﹐a 和k 是「變量」﹐而類別型態之變量就是「對象」(object)。

(4) 對象中含有那些資料。
類別的父子關系﹐決定了對象之「繼承」(inheritance) 關系﹐也決定對象中所含有之數據項。例如﹕fruittree是tree之「子類別」(subclass)﹐則fruittree類別之對象繼承tree類別內之數據項。所以指令──

dim a as new fruittree()

產生了對象 a﹐它含有 fruittree 類別內之「資料成員」﹐也含有tree類別內之「資料成員」。



(5) 如何把訊息送給對象。
訊息與對象之關系可表示如下﹕



程序的寫法為﹕


例如﹕ a.setprice( 20.0 )
及 a.setheight( 2.1 )

當計算機執行了這兩個指令﹐亦即對象 a接受到這兩個訊息﹐則 a之內容會有所變化﹔對象內部之變化也是一種行為﹐是對象對訊息之反應。此時tree類別的height值為 2.1﹐price 值為 20.0 。如果想把傳回之結果存入變量中﹐程序寫法為﹕


例如﹕


當計算機執行這兩個指令﹐即把此二訊息送給對象 a﹐則 a會傳回值﹐并經由 "="運算而存入變量中。于是amount值為 500元﹐而height值為 2.10 公尺。


習題
[1]「馬上相逢無紙筆﹐憑君傳語報平安」在此句話中﹐牽涉到幾個「人」對象呢﹖其傳遞了什么訊息﹖其訊息對這些「人」對象之行為會有何影響呢﹖
[2] 林老師請小芳打電話向小美說﹕「祝你生日快樂」。可表示如下﹕
小美. 打電話(「祝您生日快樂」)
或者 小芳. 請打電話(小美﹐「祝您生日快樂」)
或者 林老師. 打電話(小芳﹐小美﹐「祝您生日快樂」)
何者較合理﹖理由何在﹖
[3] 有對男女朋友﹐互相詢問對方的母親的生日﹐該如何表達其訊息傳遞情形呢﹖
[4] 當您要求銀行人員替您算出某帳戶本月的利息時﹐其訊息可表示為﹕
銀行人員. 計算利息(帳戶)
或者 帳戶. 計算利息()
何者較合理呢﹖

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 延川县| 武定县| 永济市| 潞城市| 资阳市| 玉林市| 柳江县| 凤翔县| 扶沟县| 麻阳| 信宜市| 开原市| 固镇县| 兴海县| 大厂| 广德县| 遂宁市| 西和县| 偃师市| 惠东县| 安阳市| 锡林浩特市| 中卫市| 托克逊县| 昭觉县| 德庆县| 南宫市| 河北区| 永福县| 土默特右旗| 库车县| 汪清县| 石台县| 怀集县| 合作市| 五家渠市| 武山县| 张家口市| 绥中县| 师宗县| 崇左市|