概念 走近VB.Net(五) VB.Net核心概念
VB.Net中文教程在行文上有些重複太多甚至有些囉嗦,以至讓人讀得索然無味,但是,這個VB.Net中文教程確實是很難得甚至可以說是經典的VB.Net文章。說老實一點,除了讀得累一些外,實在是比我寫的好多少倍。第二個問題就是很多人談到很慘,說一切要從頭學起,其實所要你學的不過是一些簡單的文法變化,最重要的是觀念的改變,也就是思維方式的轉向,也就是說在經過了最初的摸索以後,你在VB6(我是不懂VB6的,我只懂一些D(不是你想的那個D),沒有物件導向成功,現在我決定學這個了)的功力一樣會運用得酣暢淋漓。另外一些提到Beta版的問題,因為程式設計語言不同一般的軟體,雖然是Beta,基本的文法已經定向,微軟發布的的關於Beta2的文章中所涉及的主要是一些內部的組件的功能提高與Bug的修正,關鍵是VB6在讓你用得很舒服的同時也為你進行了很大的局限性,而VB.Net正是突破這些局限,另外在前不久有一些不利的傳言,這大部分是出現在VB.Net發布之前出現的。很多人甚至斷言在VS.Net中不再有VB了。而現在恰恰相反。最早宣稱VS.Net取材Java的一篇英文文章的作者在近期的撰文中聲稱更正以前的說法,他們只是要表面很象,而內部的是實現途徑是完全不同的,因為我不是很懂這些,就不談題外話了。所以對種種傳言一定要是非分明,如果你不想落後,你必須學習新興的東西,而你根本不必太過去關注一些太大的話題,例如將來VS.Net的通用語言庫會不會運行於所有的平台,起碼我只關心能不能做出好的windows程式,如果到了你必須關心這些大事的程度,這裡所有的說明對於你的水平來說只是廢話了。下面是我讀VB.Net中文教程的一些評述,兼回覆一些關於我的文章的問題
一。對象(Object)基本概念
我們且看如下一段:
原文如下“軟體的對象是自然界對象的抽象表示”
原文如下“現在的「對象導向」(Object-Oriented) 觀念﹐在軟體開發時﹐甚至寫程式時﹐對象(Object)成為腦海裡的主角。當您看到程式時﹐心理充滿著對象之影子和概念﹐函數和資料變成對象內之一部分﹐是配角而非主角了。程式設計之核心工作在於描述對象、組織對象、安排對象間之溝通(傳遞訊息)方式。就如同「人」是社會中的主要對象﹐社會是有組織的人群﹐人們之間會互相溝通、協調。”
對象的其本觀念取材於社會,程式的組織抽象於社會的組織,從寫軟體到組織軟體的形式就是進步
原文如下“由於軟體中的對象觀念和實際社會中的對象觀念是一致的﹐所以 OOP觀念使軟體與實際世界間之距離縮短了。此為 OOP技術的重要特點之一。”
什麼是OOP,一個軟體工程包括作業系統就是一個微縮的社會群體。比如我們同路人打個招呼,只要打招呼就可以,你要關心的是親疏的程度,怎樣打招呼,而不必關心你的大腦如何接受這個資訊,甚至如何發送這個資訊,以及如何處理這個資訊.
一個Namespce就是這樣一個群體(族,我取的是抽象的意義,也就是網友說的“a group of thing with common features (族).當然你完全有理由叫他名稱空間,名字空間,命名空間,名空間"。進而到族與族的關係,群體到群體的關係。
因此,
原文如下“例如﹕函數或程式導向之核心觀念──函數﹐在一般人們的心目中﹐並非熟悉之概念﹐只在數學裡學到之概念而已。因而讓人對軟體感到陌生。而在對象導向觀念中﹐實際社會之對象﹐例如﹕人、汽車、股票、磁碟機、帳單、房間、學生、教室等皆為軟體設計師腦海中的對象﹐也是程式中的對象。因之﹐不論是老闆或程式設計師來看程式﹐他們腦海中皆充滿對象之影子﹐而這些個體皆為人們生活中﹐真正活生生的東西、實在之物體或大家耳熟能詳之概念﹐使得軟體之使用者和設計者有一致的心靈、共同之感覺﹐這讓使用者對軟體更滿意﹐設計師更瞭解使用者之需要。”
也就是你作為一個人的對象想從一個位置到另外一個位置,如"S=I.tostring" ,我從I到S,I是在Integer,而S居於String.於是我過去了,從integer到string。而不必要關心他如何的過去。使用哪一個函數。
再看類別
原文如下"以上介紹的是常用之尋找對象方法﹐會尋找對象之後﹐就必需將對象分門別類﹐並且瞭解類別間之關係﹐以便把它們組織起來。例如﹐在公司的人事結構中﹐可發現人因扮演角色之不同而分為不同種類之對象﹐如推銷員、司機、經理等等。汽車可分為跑車、巴士、旅行車等不同種類之對象。如何分類(Classification)﹐是OOP 之重要觀念"
有網友拿我開玩笑,說namespace叫族,那麼這個class叫班級,不知這個玩笑對我們倒是有些啟發的,同樣是類別,A班級與B班級到頭都是學生的團體,也就是說不能形成一個類,而且學生畢業了,A班級會被C班級所取代,B班級以會被D班級所更替,所以他是有壽命的,而人類是一個類,學生是一個類,老師是一個類,這個是無壽命的。如form是一個類,form類是一直都在的,而formX在unload以後結束了, formX也就沒有了
原文如下“例如﹐一個人從出生到老﹐不超過二百年﹐而「人類」則因對象生生不息而永遠昌隆。在學校裡﹐King老師會換工作而離開學校﹐但「老師」類別將永遠存在。因之﹐個體及其所屬的群體──類別﹐皆是 OOP之核心觀念”
在看了以上一些引用後,你可能會想到,對於這些近於藝術化的解釋,中文的表述還是比較好的
二。對象Whole-Part關係
原文如下“類別繼承(Class inheritance)和對象組合(Object composition)是軟體再使用(Reuse)的兩大法寶。類別繼承就是建立父、子類別之關係﹔例如﹐「學生」可分為「大學生」、「中學生」和「小學生」三類別”
類別繼承(Class inheritance)大概是人人都知道了,至於對象組合(Object composition)你把他理解為你自已寫的一個族就很容易理解了,類通過建立子類成為族,雖然沒有明確的這樣定義,但是有助於理解,如system.drawing你可以理解為一個類,或者說類庫也可以,同樣因為含有子類,你也可以把system.drawing當作一個族名(namespace),這個子類與通過繼承關係
得到的子類意思不同,這不難理解,形象的如下:
Class class1 'Whole
Class class1-1 'Part1
.......
end Class
Class class1-2 'Part2
......
end Class
......
end Class
原文如下"對象組合的目的是﹕創造「綜合物件」(Composite object)﹔例如﹐醫院內含醫師和護士等"
原文如下"繼承與組合兩大法寶能聯合使用﹐以組織龐大的軟體系統"
1。原文如下“組合/部分關係﹐常稱為APO(A part of)關係”
Class House 房子House是一個整體
Class Door 門Door是一個部分
。。。。。。
End Class
Class Window 窗Window是一個部分
。。。。。。
End Class
。。。。。。。
End Class
原文如下“House 之對象誕生後﹐立即誕生內含之Door對象和Window對象”
所謂誕生對象就是聲明一個執行個體,如 dim xxx as new hourse(房子)
原文如下“組合對象與部分對象的壽命應該是一致的”
2。 原文如下“司機不是汽車的零件﹐客人亦非巴士之組件﹐所以汽車與司機之間並非「組合/部分」關係﹔然而﹐汽車的確包含著司機﹐因之稱為「包含者/內容」(Container-contents)關係。”
這個是一個平行的關係,如:
class i(司機)
dim x as string
.......
end class
class h(汽車)
dim myi as new i
myi.x.......
......
end class
現在i沒錢了,要到h的公司裡打工(dim myi as new i),i的資料x(dim x as string)只好交給myi.x為h服務,所以哪天環境變了,也可以反過來,h為i打工。所以是一個客體了。
所以,原文如下:“司機和汽車為獨立之對象﹐不像引擎一直包含於汽車內﹔於駕駛汽車時﹐司機才被包含於汽車內。顯然地﹐司機與汽車之壽命不一樣長。”
3。原文如下:“集合意謂著「團體」(Group) ﹐由其成員(Member)組成的群體。例如﹐學校裡的社團內有團員﹔公司的銷售部含有推銷人員。這團體並不像汽車實際包含著司機﹐而只是其成員之集合而已。這情形﹐統稱為「集合/成員」(Collection-members)關係”
也就是說在「包含者/內容」中包含者是容器,而在「集合/成員」中集合并不是容器
原文如下“不需明確劃分「包含者/內容」和「集合/成員」兩種關係”
那麼,成員與內容有什麼不同呢,準確的說,內容是一個對象,而成員是對象的集合,而這個對象的集合又被被含在整體中,而且認為這個成員即可以是外來的,又可以是本來就有的。就好比公司的成員即可以是外面請來的,又可以是內招的。這個意思有些象列表框,列表框的清單項目可以是本來就有的,又可以不停的添加進來。「包含者/內容」(Container-contents)是跑單幫,這個就是有組織的了。包含者更象一個容器,而集合反而成為對象。這就成了「包含者/集合/成員」,如果內容是一個變數,集合就是一個數組。
Class Person(成員對象--個人)
。。。。。。
End Class
Class Club(集合對象--俱樂部)
。。。。。。
Private pa As ArrayList = New ArrayList() (建立了一個集合ArrayList類,這個類的方法有Add ;Remove等)
Public Sub join(ByVal p As Person)(ByVal p As Person起到了類似dim p as person的作用,引進了一個“內容”)
pa.Add(p) (把"內容"添加到一個"集合")
End Sub
End Class