Visual Basic 7也被稱作VB.NET,具備了面向對象(OOP)編程語言的所有特征。對於VB編程人員來說,面向對象的概念和面向對象編程方式都不陌生。
如果問一個面向對象程序設計高手什麼是面向對象程序設計語言?他可能會說出一大堆諸如類、接口、消息隱匿、封裝、繼承、多態性這樣的名詞,這些名詞聽起來都很酷,不是嗎?但面向對象編程並非通過一兩天的學習或聽一次課就能掌握的。要真正地掌握面向對象程序設計,不但需要掌握一定的理論知識,同時還要進行一些實際的編程練習。本文探討了在VB.NET中運用面向對象原理編程的基本方法,全面論述VB.NET中面向對象編程的知識已經超出本文的范圍。
面向對象編程的優點
不知道讀者是否考慮過為什麼現代程序設計語言會向面向對象編程靠攏?C++、JAVA為什麼這麼普及?這是因為面向對象編程具備了幾個優點,比如:代碼維護方便、可擴展性好、支持代碼重用技術等等。這些優點是過程編程語言所不具備的。下面我們就來談談面向對象技術的這些優點:
維護簡單
模塊化是面向對象編程中的一個特征。實體被表示為類和同一名字空間中具有相同功能的類,我們可以在名字空間中添加一個類而不會影響該名字空間的其他成員。
可擴充性
面向對象編程從本質上支持擴充性。如果有一個具有某種功能的類,就可以很快地擴充這個類,創建一個具有擴充的功能的類。
代碼重用
由於功能是被封裝在類中的,並且類是作為一個獨立實體而存在的,提供一個類庫就非常簡單了。事實上,任何一個.NET Framework編程語言的程序員都可以使用.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的途徑。
如果你使用的不是Visual Studio.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.Windows.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