面向物件在VB6語言中的應用
一:面向物件(Object-Oriente)程式設計的基本概念
什麼是面向物件程式設計呢?首先,面向物件程式設計與結構化程式設計相對而言,是結構化程式語言發展到一定階段,無法解決軟體規模越來越大而出現的軟體危機,在其基礎上形成的。結構化程式設計是一種程式設計方法,是用計算機的視角來抽象問題的方法,關注的是特定問題的具體業務流程,面向物件程式設計也是一種程式設計方法,它採用從更接近真實世界的視角來分析問題,使用更接近人們理解真實世界的方法來抽象問題,模擬真實世界的方法,這種方法稱為“面向物件”(OO)。
面向物件的本質是對真實世界的抽象與模擬,把要解決的問題如業務邏輯抽象成一個個的業務模型,業務的流向和邏輯通過業務模型的互動來進行處理和分析。類與物件是面向物件程式設計中最基本的兩個概念。類是對真實世界事物的模擬和抽象,在程式設計中可以認為是自己定義的資料結構,擁有自己的方法和資料成員,其中資料成員表示類物件的狀態,而方法是改變類狀態的操作。物件是類的具體實現。類是個概念,而物件是這個概念的實體。一個完全的面向物件的語言,至少要具備以下四個最基本的特徵。
1:抽象 Abstract
2:封裝 Encapsulation
3:繼承 Inherited
4:多型 Polymorphism
1:抽象:抽象是對現實生活中相同類別事物的共有特徵的高度概括。或許這樣的解釋比較枯燥,,也不容易理解。前面提到,面向物件是對現實生活事物的模擬和真實反映,那就以現實中的例子加以說明。想象一下鳥兒的形象,不用特定指哪一種鳥,只要是說到鳥這樣概念,在腦海中基本上就會出現如下的一個形象:有翅膀,有羽毛,有兩只腳,會飛,會唱歌的精靈。為什麼說到鳥我們就自然想到是這樣的,而不是一個頭上有角,身軀龐大,有四隻腳的牛的模樣呢?這是因為有翅膀,有羽毛,有兩只腳,會飛,會唱歌是現實世界中各種各樣鳥的共同的特徵,這樣的共同特徵就是對鳥最生動的抽象。
由此可見,抽象的目的是為了提取共性,明確資料成員,清晰功能和方法。
抽象是面向物件建模中最基本的要求,在實際的程式設計對特定領域的業務建模時,一個適合的抽象能對建模的成功起到事半功倍的效果。
2:封裝。封裝是隱藏內部實現細節,只向外公佈特定的訪問介面,減少操作的複雜性。封裝的目的是為了資訊隱藏。比如天天使用的顯視器,有開啟/關閉按鈕,通過這個按鈕,就可以實現開啟和關閉顯示屏的目的,對於使用者來說,需要的是通過這樣的簡單按鈕就可以操作顯示器,根本不需要關心顯示屏的內部是如何通過這個按鈕真正實現對顯示屏的開啟和關閉的工作。這是現實中的封裝。面向物件中的封裝主要的作用也在於些:隱藏實現細節,實現程式碼的安全性。
3:繼承。繼承的含義是父類擁有的特徵和功能,子類可以自動擁有。繼承的目的是為用程式碼重用,縮短編碼時間,減少開發周期。世界萬物中,存在著許多生動的現象來告訴我們什麼是繼承,比如說鳥的一種:百靈鳥,因為屬於鳥這個類別,就自然擁有鳥兒有翅膀,有羽毛,可以飛翔,可以歌唱的本領。俗話中的“虎父無犬子”,“老鼠的兒子會打洞”等等,都是在用通俗但很精闢的語言闡述著什麼是繼承。
4:多型。多型是面向物件語言中最難理解的概念,事實上也是使用最廣泛的一個特性。從字面意義來理解,多型就是一個物件具有多種形態。從程式實現上來看,多型是父類通過呼叫不同子類的相同方法,實現不同子類相同的操作,達到不同的效果,產生出不同的形態。還是以剛才的例子來說明吧,百靈是鳥的一種,黃鸝也是鳥的一種。它們都有由父親繼承下來的動作:歌唱。但百靈歌聲清脆悅耳,黃鸝歌聲婉轉動人。同樣的一個動作,不同的鳥兒會唱出不同的旋律,但我們都可以說是鳥兒在歌唱。這就是生活中的多型。正是存在著各種各樣的多型,窗外的世界才會如此多姿多彩,耳邊才時時響起醉人的燕語鶯聲。
二:VB6中的面向物件應用
初步瞭解了面向物件的基本概念後,現在我們來看看,VB6中面向物件三大特徵的實現和應用。
1:封裝
封裝應該是VB6中用得最多的面向物件的概念。封裝在面向物件語言中常表現為:屬性,方法和事件。屬性應該是VB中實現封裝最多的一種,具體實現很簡單,定義好一個私有變數,再定義好相應的Let 和 Get 屬性 就可以實現榜上相應的屬性。Get和Let分別對應著對這個屬性的Read(讀) 和 Write (寫)
相關方法如下:
Private sSomeValue As String
Public Property Let SomeValue( Byval vData as string)
sSomeValue = vData
End Property
Public Property Get SomeValue() As String
SomeValue = sSomeValue
End Property
2: 繼承
VB6中通過implentments關鍵字來實現繼承。要注意的是,在VB中指定繼承後,對於父類所公開的的屬性和方法,必須要手動在子類中一個一個的實現。當然如果覺得手動編碼不方便的話,也可以通過IDE中的ClassBuilder類生成器幫助也可以。
但有點奇怪的是,在VB6中,子類從父類那繼承的,只能是介面,而不能繼承父類中的實現。就算是介面,也要在前面加上父類的名稱才可以正確編譯。這樣看來,VB6中的繼承,實際上只能算得上的面向介面繼承,而不能稱為面向實現繼承了。面向實現繼承是可復用的基礎,VB提供的只是介面繼承,無法提供實現繼承,再加上也不能實現過載(override)和過載(overload)的功能,這些可能是VB中面向物件無法得到廣泛使用的原因之一吧
3:多型
相對於繼承支援的不足, VB6對多型的實現是很成功。仔細思考後也就清楚了其中的原因,多型的實質是介面與實現分離,父類定義介面,子類實現介面。而VB中的繼承恰恰實現的就是面向介面繼承,所有的實現都必須在子類中完成。表現出的正是多型的特徵。
由於VB6中無法實現面向實現繼承,再加上訪問修飾符只有Private和Public兩種,沒有針對繼承的Protected。所以VB6應該不能稱上是真正的面向物件語言。幸運的是,在DotNet環境下,VB.Net實現了以上的所有不足,成為一個真正的面向物件語言。
三:讓我們看得更得更深入點
1:封裝變化
封裝的目的是實現資訊隱藏,簡化訪問操作。但要明確的是,封裝的物件是什麼?或許大家都有過這樣的開發體會,在開發過程中,有時需求的一點變更會引起多處程式的修改,嚴重時會因為一個小小的修改而導致好多意想不到的Bug。使用者的需求可能千變萬化,理想的情況當然是在系統分析中把所有的業務邏輯和情況都考慮到,但業務發展無法預見,再完美的系統設計也無法解決未知的業務發展變化。而程式開發參考的是現有的專案設計文件和開發文件,所以業務的變更結果是程式修改無法避免。那麼如何做到程式設計中在滿足新的需求變化的同時,盡可能減少修改呢?現實中的封裝或許可以幫助我們找到部分答案:顯示器通過連線線與PC主機通訊,實現正常工作。以前使用的是15’顯示器,然後發展成17’純平,現在流行液晶了。但對於主機來說,不論顯示器的型別如何變換,大小如何改變,形狀如何變幻,但只要顯示器提供的連線線結構不變,主機就不用做任何的改動,繼續通過顯示介面與顯示器正常通訊。看,多麼簡單但又高效的設計,解決了人們對顯示器要求的不斷更新。在程式設計中,我們也可以學習這樣的思想來解決不斷出現的需求變化:封裝變化,將存在變化的業務邏輯封裝成一個或多個獨立的類,提供相應的功能介面供外部程式使用。但業務規則發生改變時,只須修改封裝這一業務邏輯的類,將修改所引起變更的範圍壓縮到最小。只要對外的介面函式沒有改變,外部與這個類互動的程式碼就不用做任何修改,自然就不用擔心程式中其它程式碼會因為這次的修改而產生更多的Bug。
2:狀態維護
面向物件的封裝的目的是為了資訊隱藏,提供程式碼訪問的安全性。
對於一個類來說,封裝的結果對外表現為屬性和方法。其中屬性是類狀態表現,而方法表現出來是類能實現的功能和操作。
類屬性與全域性變數是有區別的,在程式執行時,同一時間內,全域性變數只能有一個值,程式中所有訪問該全域性變數的程式碼,得到的是相同一個值。屬性不同,類在程式執行時必須要例項化成具體的物件才能工作,所有例項化的物件都有相同的屬性,但每一個物件的屬性值都可能不同。每一個不同的屬性值都可以看成是同一個類同一屬性不同狀態的表現。
3:面向介面繼承和麵向實現繼承
面向基類繼承也就是面向實現繼承,表現出的是子類自動擁有父類的特徵,自然界的遺傳特性基本上都可以看成是典型的面向基類繼承。那麼面向介面繼承該怎麼理解呢?我們可以把介面理解成是一系列概括性規範和標準,還沒有做定具體的規則。不同的實現者可以按照自己的實際情況去填充和實現。
舉個例子,一老漢,做了一個麵餅,給了他的幾個兒子,老大用這個餅,加上點餡,包一下,做成了包子,老二用這個麵餅,在外面刷上油,撒上料,烤一烤,做成了燒餅,老三呢,胡亂做,在餅上抹上亂七八糟的東西,烤一烤,做成了披薩餅。面向基類繼承就是這樣,基類提供了基本的實現,子類就在其基礎上面添料,最終就成了每個人心中想要的餅。同時,因為老爸最初給的是面餅,所以做出來的東西都是由面構成的。
面向介面則不一樣,老漢沒有給兒子們實際的面餅,而是寫了一個制餅的指南,然後把這個指南發給兒子們,兒子們按著制餅指南上的規則,各自按自己的想法去做實際的餅了。至於原料,兒子們可以用面,也可以用其它的東西。
4: 多型的使用
多型是面向物件設計中應用最廣泛的特徵,多型的目的是在在繼承的基礎上又提供子類實現變異的可能性,可以這麼說,沒有多型,面向物件程式設計就失去最吸引人的部分。那麼,多型在實際的程式設計中如何使用呢?
還是以部落格園中的一個比喻來加以闡述吧:
一日300多人一起打掃衛生,不懂多型的領導A發號施令道:張三去掃地、李四去擦窗戶、王五去打水......話未畢,累倒當場,立僕。
上級隨即派來一懂得多型的領導B,不愧青年才俊,他只發布了一道命令:大家都去幹活。於是各司其職,不一會事畢.....
領導A之所以不幸,就是簡單的一個打掃衛生的任務,分派時複雜到每個員工,累死了。領導B吸取了A的教訓,用了一個統一的命令分派所有員工的任務,具體到每一個員工如何工作,則是由每一個員工自己根據實際情況決定是去掃地,還是擦窗戶,還是去打水。
想想看,領導A發號施令的場景,多麼象我們在程式中用到的Case/If語句?分類情況很少時,用Case/If語句當然不會覺得有什麼不妥,但如果分類的情況有成千上萬種,請想象一下,你的程式到時會有多長,時間一長,又如何來維護?
5:抽象類與介面
類的繼承表現出來的是“Is A “ 概念,表明的是“是一種….”,介面繼承表現出來的是”Can Do”概念,表明的是“能做….”,比如任何從鳥這個抽象類繼承出的類,自然是鳥的一種。介面定義的是一組規範,一組能力,繼承自介面,實現這組介面,就擁有處理這些介面的能力。
一個類可以同時擁有多種不同性質的能力,當然可以從多個介面直接繼承。但類繼承不同,類無法從多個類直接繼承。百靈不可能是鳥,同時又是牛吧?
“Is A”和”Can Do”是抽象類與介面最本質的區別,從這個區別直接導致抽象類與介面表現出的某些區別:
1:一個類只能從單個抽象類繼承,但可以從多個介面中繼承
2:在介面中只能定義方法,但抽象類中除了方法外,可以有屬性
3:介面的方法預設都是Public的,抽象類的方法不必全都是Public
6:虛方法與抽象方法
在OOP中,以abstract關鍵字標識的方法叫抽象方法,抽象方法只是定義一個方法宣告,沒有提供方法實現,表示抽象方法所屬的類擁有這樣的一種能力。
所有從該抽象類繼承的具體類,都必須實現這個抽象類的所有抽象方法。這樣的一種規則我們稱為是“強制實現”。
以virtual關鍵字標識的方法叫虛方法,從含義上我們可以認為虛方法是一個允許其子類重新定義的方法。
抽象方法與虛方法最大的區別是前者是強制實現,而後者是允許其有選擇的重新實現,不實現也可以。
再一個區別就是擁有抽象方法的類不可以例項化,而擁有虛方法的類不受此限制。
相關推薦
面向物件在VB6語言中的應用
一:面向物件(Object-Oriente)程式設計的基本概念什麼是面向物件程式設計呢?首先,面向物件程式設計與結構化程式設計相對而言,是結構化程式語言發展到一定階段,無法解決軟體規模越來越大而出現的軟體危機,在其基礎上形成的。結構化程式設計是一種程式設計方法,是用計算機
Java面向物件高階--繼承的應用----整形陣列類、排序類、反轉類
分析: class Array{ // 表示陣列 private int temp[] ; // 整型陣列 private int foot ; // 定義新增位置 public Ar
設計一種面向物件指令碼語言
有沒有感覺設計一門語言實在是太有意思了,可以自定義語法規則,我的“地盤聽我的”。 指令碼語言的功能 本書設計一門純粹的面向物件指令碼語言,任何語言都有個名詞,這裡給這個語言起個名字——sparrow(麻雀)。它支援的功能如下。 1 變數 支援區域性變數和區域性變數的定
面向物件 子類中 < 過載 重寫 >父類的方法
<?php header("Content-Type: text/html; charset=utf-8"); class person{ public $name; public $age; public $sex; public function __
java語言基礎(33)——面向物件(父類中沒有無參構造編譯報錯——無法將類 xxx中的構造器 xxx應用到給定型別 實際引數列表和形式引數列表長度不同)
注意:以下程式碼是錯的。 class Father { public Father(String name){ System.out.println("Father帶參構造"); } }
基礎知識漫談(5):應用面向物件來分析“語言”
萬物皆物件。 如果面試官問你“什麼是面向物件”,萬物皆物件就是個很好的開場白。 在網上認識的一些新人(甚至部分有三五年經驗的老鳥),在談論到面向物件\面向過程的時候,就陷入了誤區。 誤區一,面向物件和麵向過程是非此即彼的對立方,相互不相容。 誤區二,面向物件是種形而上
多語言協作-作業系統級上應用面向物件方法的一個簡單例項
為什麼要多語言混合程式設計 答案很簡單: 每種語言各有所長,各有所短,計算機世界同人的社會一樣,合作才是王道。 合作才能取長補短,提高程式設計和實現的效率。 C擅長於底層,高明於效率;JAVA是網路開發的不二之選,Python程式設計簡單,各種應用包很多,便
static的作用,在面向物件和麵向過程中的應用
在C語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。 (1)先來介紹它的第一條也是最重要的一條:隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,一
GO語言使用之面向物件程式設計(9)面向物件程式設計應用
一、面向物件程式設計的步驟 1、宣告(定義)結構體,確定結構體名 2、編寫結構體的欄位 3、 編寫結構體的方法 二、實現案例: 1) 編寫一個Student結構體,包含name、gen
Java語言中的面向物件特性總結
Java語言中的面向物件特性 (總結得不錯) 【課前思考】 1. 什麼是物件?什麼是類?什麼是包?什麼是介面?什麼是內部類? 2. 面向物件程式設計的特性有哪三個?它們各自又有哪些特性? 3. 你知道java語言在面向物件程式設計方面有何獨
C語言中的結構體與面向物件程式設計思想
沒有萬能的程式設計技術 沒有隻產生正確的結果的程式語言 不是每個專案的程式設計都是從零開始的 —-《Object-Oriented Programming With ANSI-C》 一、C語言結構體 1、結構體是什麼 (1
Go語言基礎之面向物件程式設計中
1 Golang面向物件程式設計基本介紹 Golang仍然有面向物件程式設計的繼承,封裝和多型的特性,只是實現的方式和其它OPP語言不一樣,隨後分別介紹Golang對面向物件程式設計的三大特性是如何實現的。 2 面向物件程式設計-封裝 2.1 封裝介紹 封裝(encapsulation)就是把抽象出的欄位和對
再談面向物件中的封裝、繼承和多型
封裝 封裝說的是把資料封裝起來,對外暴露一個可以訪問的介面,不能讓外界直接訪問內部的資料。 從上面的描述可以抽取出兩種型別:介面和類。 從現在比較火的微服務的觀點上來看,一個類就是一個服務,一個物件就是一個服務的例項,通過這個服務暴露的介面來訪問這個服務。從這個意義上來講,面向
Matplotlib面向物件的繪圖方式中不同Artist物件的介紹
Matplotlib是一個面向物件的繪相簿,在最終影象上所呈現出來的所有元素,都是一個可以控制的物件,那麼如何理解繪圖的過程呢?可以簡單地類比在畫布上畫圖的過程, 首先大致的繪製流程: 建立Figure物件(相當於在畫架上新增畫布) 為滅一個Figure物件新增一個或者多個
3.Java面向物件程式設計OOA/OOP/OOD/OOAD()/UML類圖、函數語言程式設計Scala(JVM)---類與物件、封裝繼承多型、構造方法、覆寫/重寫/override
一、緒論 1.面向物件程式設計正規化(C++、Java、Go)------能進行現實生活的抽象。 每個物件都是一個類。類中包含屬性與方法。 OOA:面向物件分析 OOP:面向物件程式設計
Scala中的面向物件
作者:林偉兵,叩丁狼高階講師。本文為原創文章,轉載請註明出處。 5. 面向物件 5.1 類的定義[屬性和方法] 可以用class來宣告一個類,並用new關鍵字來建立一個物件。 對於類中的全域性變數,必須在宣告的時候指定其預設值,否則就會報錯。
Python3中面向物件------繼承
以下是我對Python3面向物件------繼承的理解,因為博主也是初學Python3,有很多東西都還停留在表層的理解,如果我的部落格有任何錯誤,請及時評論或者私信我,我會及時更改。也歡迎同樣學習Python的你願意關注我的部落格,我會把我每週的學習內容進行整
Es6中Map物件和Set物件的介紹及應用
map和set的方法,工作中有使用到,所以學習一下: Map 物件 Map 物件儲存鍵值對。任何值(物件或者原始值) 都可以作為一個鍵或一個值。 var myMap = new Map(); myMap.set("bar", "baz"); myMap.set(1, "foo"
雲風大神部落格中的Lua實現面向物件
在 Lua 中實現面向物件 在 pil 中,lua 的作者推薦了一種方案來實現 OO,比較簡潔,但是我依然覺得有些繁瑣。 這裡給出一種更漂亮一點的解決方案:為了貼程式碼和修改方便,我把它貼在了 wiki 上。 Lua 中實現面向物件 在這個方案中,只定義了一個函式
《面向物件程式設計——C++語言描述》學習筆記(二)
第二章 從C到C++ 2.1main函式 1.C++中需要寫int main()不能只是main() 2.main()函式裡面最後有一個return 0; 3.main()被啟動程式碼呼叫,而啟動程式碼是編譯器新增到程式中的,是程式和作業系統的橋樑。 4.C++中main()中