VB.NET中的物件導向程式設計特徵 (轉)

worldblog發表於2007-12-13
VB.NET中的物件導向程式設計特徵 (轉)[@more@]

中的面向特徵

劉彥青

(本文轉載自工程專家網,不代表gigix觀點)

 

   7也被稱作VB.NET,具備了物件導向()程式語言的所有特徵。對於VB程式設計人員來說,物件導向的概念和麵向物件程式設計方式都不陌生。

  如果問一個物件導向設計高手什麼是物件導向程式設計語言?他可能會說出一大堆諸如類、介面、訊息隱匿、封裝、繼承、多型性這樣的名詞,這些名詞聽起來都很酷,不是嗎?但物件導向程式設計並非透過一兩天的學習或聽一次課就能掌握的。要真正地掌握面向對
象程式設計,不但需要掌握一定的理論知識,同時還要進行一些實際的程式設計練習。本文探討了在VB.NET中運用物件導向原理程式設計的基本方法,全面論述VB.NET中物件導向程式設計的知識已經超出本文的範圍。

物件導向程式設計的優點

  不知道讀者是否考慮過為什麼現代程式設計語言會向物件導向程式設計靠攏?C++、為什麼這麼普及?這是因為物件導向程式設計具備了幾個優點,比如:程式碼維護方便、可擴充套件性好、支援程式碼重用技術等等。這些優點是過程程式語言所不具備的。下面我們就來談談物件導向技術的這些優點:

  維護簡單

  模組化是物件導向程式設計中的一個特徵。實體被表示為類和同一名字空間中具有相同功能的類,我們可以在名字空間中新增一個類而不會影響該名字空間的其他成員。

  可擴充性

  物件導向程式設計從本質上支援擴充性。如果有一個具有某種功能的類,就可以很快地擴充這個類,建立一個具有擴充的功能的類。

  程式碼重用

  由於功能是被封裝在類中的,並且類是作為一個獨立實體而存在的,提供一個類庫就非常簡單了。事實上,任何一個.NET 程式語言的程式設計師都可以使用.NET Framework類庫,.NET Framework類庫提供了很多的功能。更令人高興的是,我們可以透過提供符合需求的類來擴充這些功能。

  下面我們最簡單的特性開始來論述物件導向程式設計的一些特性。

  在物件導向程式設計技術中,類是重點中的重點。簡單地說,類是一種提供一定功能的資料型別。在VB.NET中定義一個類要用到關鍵字Class,例如,下面的一小段程式碼就定義一個名字為Employee的類:

  Employee類

  Class Employee

  End Class

  定義一個類就是這麼簡單。注意,在對類命名時,推薦使用Pascal語言的命名規則。根據這種命名規則,就意味著類名的第一個字母必須大寫,並且後面的併發連結詞的第一個字母均為大寫,例如象GeneralManager、SmallDictionary、StringUtil都是合乎這種規則的類名。

類成員

  一個類有象域、屬性、子程式和這些成員,例如,下面的employee類中有一個名字為work的子程式:

  包含Work方法的Employee類

  Class Employee

  Public Sub Work ()

  ' Do something here

  End Sub

  End Class

  子程式和函式都被稱為方法,方法的命名也遵循Pascal語言的命名規則。

  另一種類成員是域。域的命名法則遵循camel規則,即除第一個子串外的所有子串的第一個字母大寫。象salary和quarterlyBonus都是符合規則的域名。下面的程式碼在Employee類中新增了salary和quarterlyBonus這二個域:

  增加了二個域的Employee類

  Class Employee

  Dim salary As Decimal = 40000

  Dim yearlyBonus As Decimal = 4000

  Public Sub PrintSalary()

  ' print the salary to the Console

  System.Console.Write(salary)

  End Sub

  End Class

  Module Module1

  Public Sub Main()

  Dim anEmployee As Employee

  anEmployee = New Employee()

  anEmployee.PrintSalary()

  End Sub

  End Module

  上述程式碼段中的Module1模組中提供了子程式的Main函式,這也是VB.NET程式開始的地方。要編譯源程式,就必須用一種或另一種方式提供訪問Main Sub的途徑。

  如果你使用的不是.NET,那麼可以使用vbc.exe軟體編譯VB.NET源程式,vbc.exe是在.NET Framework時自動安裝的。例如,當你把儲存為Employee.vb後,在Employee.vb所在的目錄下,輸入vbc Employee.vb即可編譯該源程式。

  現在我們再來看看上面的程式碼,子程式的Main函式首先定義了一個Employee型別的變數━━anEmployee:

  Dim anEmployee As Employee

  然後使用關健詞New對Employee進行初始化:

  anEmployee = New Employee()

  這樣,我們就得到了一個Employee型別的變數,我們就可以使用它的功能了(福特汽車公司的工程師生產出汽車後,我們就可以啟動並駕駛它了。)。在我們的例子中,可以使用下面的方法PrintSalary方法:

  anEmployee.PrintSalary()

  這一方法會列印Employee中salary變數的值。

  當然,我們也可以將子程式的Main函式移到類的定義中去,這樣就無需再使用模組了。下面的程式碼即演示了這種方法:   子程式的Main函式在類的定義中

  Class Employee

  Dim salary As Decimal = 40000

  Dim yearlyBonus As Decimal = 4000

  Public Sub PrintSalary()

  ' print the salary to the Console

  System.Console.Write(salary)

  End Sub

  Public Shared Sub Main()

  Dim employee As Employee

  employee = New Employee()

  employee.PrintSalary()

  End Sub

  End Class

  註釋:PrintSalary方法中的System.Console.Write表示我們呼叫了Console類中的Write方法,而Console類又是System名字空間的一部分。關於名字空間的要領將在下面的部分討論:

名字空間

  在編寫.NET軟體時,我們會用到類和其他型別。為了使應用程式更有條理性,可以將類組合為名字空間,微軟的.NET Framework類庫就是這樣的。如果開啟.NET Framework SDK文件中的.NET Framework Class Library,會看到其中有80多個名字空間,需要經常乃至的重要的名字空間包括System、System.IO、System.Drawing、System..Forms等。例如,在Employee類的PrintSalary方法中,我們就使用了System名字空間中的Console類。

  如果要在程式中使用名字空間,可以首先匯入它,以便在以後每次使用其成員時無需重複該名字空間的名字。例如:可以將表4、5中的程式碼改寫為下面表6中形式:

  匯入名字空間

  Imports System

  Class Employee

  Dim salary As Decimal = 40000

  Dim yearlyBonus As Decimal = 4000

  Public Sub PrintSalary()

  ' print the salary to the Console

  Console.Write(salary)

  End Sub

  Public Shared Sub Main()

  Dim employee As Employee

  employee = New Employee()

  employee.PrintSalary()

  End Sub

  End Class

  好了,我們現在就可以在PrintSalary方法使用Console類而無需引用名字空間,因為我們已經匯入這個名字空間了。

  我們還可以在不同的名字空間中擁有相同名字的類。要正確地使用一個類,通常的做法是在一個類的前面使用名字空間的名字。例如,可以以System.Console的方式使用System名字空間中的Console類。

訪問型別

  在很多情況下,我們都會將編寫好的類提供給別人,供他們使用它提供的功能,例如,他們可以呼叫類的一個方法或者訪問其中的一個域。物件導向程式設計的一個最大的好處是開發人員可以方便地控制對類成員的訪問,這意味著我們可以完全控制想讓別人使用的部分。我們可以使一個方法可以被別的開發人員使用,也可以使一個類成員只能在該類中被訪問。   在VB.NET中,訪問是分等級的。下面我們來討論這些等級:

  pPublic:Public類成員沒有訪問限制。在一個類成員前面新增Public關健字就使得它可以被隨意訪問。例如,Employee類中的PrintSalary方法就是一個public方法,可以從任何地方對它進行訪問。

  Private:秘密的類成員只能被該類內部的其他成員訪問。使用Private關健字就可以使一個類成員成為秘密的。

  Protected:被保護的類成員只能被該類的派生類和該類本身內部進行訪問。使用Protected關健字就可以使類成員成為被保護的類成員。

  Friend:具有friend級訪問限制的類成員只能在定義該類的程式內部使用,使用Friend關健字就能使類成員具有friend級訪問限制。

  Protected friend:這是protected和friend二種訪問型別的組合。這些不同的訪問型別使物件導向程式設計具有了資訊隱慝能力。也就是說,我們可以使用這些訪問型別保護不願意讓別人訪問的資訊。

靜態成員

  我們再來看看錶4、5、6中的Employee類,也許讀者會對我們沒有將System.Console類例項化就使用它的Write有點不理解,為什麼我們可以這樣做呢?因為在物件導向程式語言中,有一種被稱作靜態成員的特殊的類成員,VB.NET也有靜態成員這一概念。

  無需對一個物件例項化就可以使用其中的靜態成員。例如,下面的表7中,SalaryLevel類中就只包含有靜態的域:

  類中的表態成員

  Class SalaryLevel

  Public Shared Level1 As Decimal = 35000

  Public Shared Level2 As Decimal = 40000

  Public Shared Level3 As Decimal = 45000

  Public Shared Level4 As Decimal = 50000

  Public Shared Level5 As Decimal = 55000

  Public Shared Level6 As Decimal = 60000

  Public Shared Level7 As Decimal = 65000

  Public Shared Level8 As Decimal = 70000

  Public Shared Level9 As Decimal = 75000

  Public Shared Level10 As Decimal = 80000

  End Class

  我們可以象表8中的程式所演示的那樣在程式中使用類:

  Listing 8: Using a static member of a class

  Imports System

  Class SalaryLevel

  Public Shared Level1 As Decimal = 35000

  Public Shared Level2 As Decimal = 40000

  Public Shared Level3 As Decimal = 45000

  Public Shared Level4 As Decimal = 50000

  Public Shared Level5 As Decimal = 55000

  Public Shared Level6 As Decimal = 60000

  Public Shared Level7 As Decimal = 65000

  Public Shared Level8 As Decimal = 70000

  Public Shared Level9 As Decimal = 75000

  Public Shared Level10 As Decimal = 80000

  End Class

  Class Employee

  Dim yearlyBonus As Decimal = 4000

  Public Sub PrintSalary()

  '使用SalaryLevel類的靜態域向Console輸出工資額

  Console.Write(SalaryLevel.Level4)

  End Sub

  Public Shared Sub Main()

  Dim employee As Employee

  employee = New Employee()

  employee.PrintSalary()

  End Sub

  End Class

  在Employee類的PrintSalary方法中,我們可以在不首先建立SalaryLevel類變數的情況下使用其中的靜態域Level4。不屬於靜態成員的類成員被稱作例項成員。

構造器

  A構造器是類初始化所必須使用的特殊方法,在VB.NET中,這一方法被稱作New。但我們在前面的程式碼中可以發現,在類中我們沒有定義New這個方法。正是這樣,如果類中沒有定義構造器,VB.NET將自動地建立一個構造器,當使用關健字New對物件進行初始化時,也就呼叫了類的構造器。當然,我們也可以自己編寫物件在初始化時所執行的程式碼。

  如果我們在程式中建立了構造器,VB.NET就不會再自動為該類建立構造器了。

繼承

  繼承是擴充套件類的一種特性。如果需要完成一些功能,當然可以建立一個新類,但如果別人所建立的類可以提供一部分你所需要的功能,就可以建立一個擴充了原有類的新類,我們建立的類可以稱為子類或派生類,原來的類可以被稱為基礎類或父類。有時,子類和繼承也用於描述對類的擴充。在VB.NET中,一個類只能繼承一個父類,多類繼承在VB.NET中是不允許的。

  從語法上說,在類名後加一個冒號,後面再加上關健字Inherits和父類的名字就可以完成對類的繼承。例如,下面表9中的程式碼就透過擴充Employee類建立了一個被稱為Manager的新類:

擴充類

  Imports System

  Class Employee

  Dim salary As Decimal = 40000

  Dim yearlyBonus As Decimal = 4000

  Public Sub PrintSalary()

  ' print the salary to the Console

  Console.Write(salary)

  End Sub

  End Class

  Class Manager: Inherits Employee

  End Class

  如果關健字出現在下一行上,則子類名後面的分號就不需要了,如下面的程式碼所示:

  Class Manager

  Inherits Employee

  End Class

  現在,我們就可以初始化一個Manager物件,並使用Employee中的成員。如下面表10中的程式碼所示:

  初始化Manager物件

  Class Employee

  Public salary As Decimal = 40000

  Public yearlyBonus As Decimal = 4000

  Public Sub PrintSalary()

  ' print the salary to the Console

  Console.Write(salary)

  End Sub

  End Class

  Class Manager: Inherits Employee

  End Class

  Module Module1

  Public Sub Main()

  Dim manager As Manager

  manager = New Manager()

  manager.PrintSalary()

  End Sub

  End Module

  下面表11中的程式碼演示瞭如何透過編寫一個新的PrintBonus方法來擴充Manager類別的方法:

  在子類中新增新的方法

  Class Manager: Inherits Employee

  Public Sub PrintBonus()

  Console.Write(yearlyBonus)

  End Sub

  End Class

  注意成員可訪問性限制的使用。例如,如果使yearlyBonus域具有private屬性,該哉就不能被Manager類訪問,因此,編譯這樣的程式碼就會發生錯誤。

  繼承是物件導向程式設計中常用的方法。實際上,.NETFramework類庫中就有許多由繼承其他類得到的類。例如,Windows.Forms名字空間中的Button類就是ButtonBase類的一個子類,而ButtonBase類本身又是Control類的一個子類。所有的類最終都是System.類的子類,在.NET Framework類庫中,System.Object類被稱為根或超級類。

  表12中的程式碼演示了繼承的強大功能:

  擴充System.Windows.Forms.Form

  Public Class MyFo: Inherits System.Windows.Forms.Form

  End Class

  這是一個空的類定義,在被編譯和執行時,就會顯示一個Windows窗體。看看,無需編寫一行程式碼我們就可以建立一個窗體,這是因為MyForm是由System.Windows.Forms.Form繼承生成的,它繼承了Form類的功能。

不可繼承的類

  我們可以透過使用NotInheritable關健字使自己的類不可被別人繼承。例如,表13中的Calculator就是不可繼承的:

不可繼承的類

  NotInheritable Class Calculator

  End Class

  如果擴充這個類就會引起編譯錯誤。為什麼會使我們的類不可繼承呢?一個原因是不希望別人擴充我們的類,另一個原因是不可擴充的類產生的程式碼執行速度更快。儘管這樣,我們還是應該小心地使用不可繼承的類,因為它不符合物件導向程式設計的初衷,只有在100%地肯定不擴充這個類時,才能使它不可繼承。

  在有些物件導向程式語言中,這些類也被稱作最終的類。

結論

  VB.NET支援許多物件導向程式設計的特徵。本篇文章討論了VB.NET中一些基本的物件導向特徵,希望能夠使廣大讀者能夠對VB.NET中物件導向程式設計特徵有一個基本的認識,並起到一個拋磚引玉的作用。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章