(華版)
每當我們提到Object Oriented編程時就好自然想起Class;Class又是何物?有何用處?Class只不過是用來形容對象(Object)所包容的屬性(Properties),方法(Method)和事件(Event)。除此之外,Class也描述誰能與不能訪問其屬性,方法和事件。
假設用一輛汽車來跟Class相比。那Class就是汽車的建造藍圖;而汽車也就是用此藍圖所建造出來的對象,也就是説Object是Class聲明和實例(instantiate)的對象。因為汽車擁有屬性(長,寛,顏色等等屬性),方法(啓動,停止,前往,後退等等方法)和事件(汽油將要用完,防盜系統喇叭響等等事件)。
所以在還沒開始設計一個Class時,我們應花多點時間去瞭解相關的商業問題和需求!這樣才能設計出一個完美無瑕的Class,然後應用在客戶的商業解決方案。這也反映怎樣達到重用同一個Class的源代碼在不同的方案了和節省應有得開發資源(員工,時間和金銭)。。。就是所有投資者和商家最感興趣的一個項目;世界往往就是如此殘酷。。。身為一個編程員。。。也只好默默的去接受!
好了,寫了一大堆前言。。。也應該聊一點對一個編程員最為感興趣的話題;也就是此篇隨筆的重點《VB.NET的Object Oriented編程內功心法》。何為內功心法?就是用VB.NET冩Object Oriented編程的最基本的知識,包括如何用VB.NET達到Inheritance同Polymorphism之效果;有了此基本基礎,以後要冩一個好的Class就像如虎添翼那般容易了。
內功心法一:
首先就是要寫一個最基本Class的空殻;只要緊記以下的文法就可以了,能跨出第一步。。。就有好的開始了。
Public Class ClassName
'// ...
End Class
內功心法二:
要怎樣在Class裡聲明Data Member;但是往往每一個Data Member都會有不同的訪問範圍。也就是Public,Private或Protected都有不同的意義。比如:
Public 代表屬性,方法和事件是那裡都可以訪問,包括此Class的內和外。
Private 屬性,方法和事件只能訪問在此Class的裡面。
Protected 屬性,方法和事件只能訪問於Inherited的Derived Class。
Public Class ClassName
[Public | Private | Protected] Variable As DataType
'// ...
End Class
內功心法三:
加添方法進Class裡面。方法(Method)可以是Sub(不回遞值數)或Function(回遞值數);有些更會有Argument,有多少個Argument(參數)就要看此方法的功能而定了。所以一般方法的Prototype就大可冩成:
Public Class ClassName
[Public | Private | Protected] [Overloads] [Sub] MethodName (Byval Argument As DataType, ...)
'// ...
End Sub
End Class
Public Class ClassName
[Public | Private | Protected] [Overloads] [Function] MethodName (Byval Argument As DataType, ...) As DataType
'// ...
Return Value
End Function
End Class
而Overloads關鍵字就是用來聲明多個同名稱但參數不同的函數,一般是用來減少函數命名的困憂!
內功心法四:
也就是在Class裡加添屬性(Properties)。有些屬性的值數只限於讀取而不能冩,有些就只能冩而不能讀取;但一般都是兩者兼施
Public Class ClassName
Private VeriableName As DataType
[Public | Private | Protected] [Property] PropertyName ( ) As DataType
Get
'// ...
Return VeriableName
End Get
Set (ByVal Value As DataType)
VeriableName = Value
End Set
End Property
End Class
只能讀取值數的屬性:
Public Class ClassName
Private VeriableName As DataType
[Public | Private | Protected] [ReadOnly] [Property] PropertyName ( ) As DataType
Get
'// ...
Return VeriableName
End Get
End Property
End Class
只限於冩值數的屬性:
Public Class ClassName
Private VeriableName As DataType
[Public | Private | Protected] [WriteOnly] [Property] PropertyName ( ) As DataType
Set (ByVal Value As DataType)
VeriableName = Value
End Set
End Property
End Class
內功心法五:
怎樣在Instantiate Class的同時聲明和執行某些函數,例如建立一個新的SqlConnection Object或者聲明變量等等。要達到這一點,我們就利用Class的Constructors函數了。以下就是在Class裡添加Constructor函數的prototype。
Public Class CalssName
[Public] [Sub] New ( )
'// ...
End Sub
End Class
因為此是Object Oriented編程,所以也可以聲明多個不同參數的Constructor函數。但在此就跟編冩Overloads方法(Method)有點不同,那就是不需要用Overloads關鍵字來表示該函數就是Overloaded函數。
Public Class CalssName
[Public] [Sub] New (Byval Argument As DataType)
'// ...
End Sub
End Class
內功心法六:
有了Contructor當然就要有Destructor嘛;世界所有物軆本來是雙雙對對。。。就連Object Oriented編程也一樣,否則就不平衡了。而Destructor函數是在系統將要釋放Object時所執行,所以一般Destructor都是用來解放在整個Object裡所用過(聲明和實例)的資源。
Public Class ClassName
[Protected] [Overrides] [Sub] Finalize ( )
'// ...
End Sub
End Class
內功心法七:
往往我們會選擇聲明Public變量方法和外界(Class與Class之間)分享其值數;但這樣共用變量是極不安全也很浪費資源(每一個Class都會聲明自己的變量)!為了更安全,更節省資源和設計一套好的流程式控制制;我們可以用Shared關鍵字去達到變量共用而又不浪費資源但又很可靠。。。也就是在多個Class的Instant裡只有一分變量的存在!Shared變量的另一好處就是不用Instantiate該Class也能使用,只需用Class的全名就可一了ClassName.Variable。
Public Class ClassName
[Public] [Shared] Variable As DataType
'// ...
End Class
內功心法八:
可以在Class裡共用變量,那共用方法也一樣。只需在方法(內功心法五)的文法裡加上一個Shared關鍵字,就是那麼的簡單!但是就要緊記一個重點;Shared方法只能冩和讀取Shared變量的值數!
Public Class ClassName
[Public] [Shared] [Sub] MethodName (Byval ArgumentAs DataType, ...)
'// ...
End Sub
End Class
Public Class ClassName
[Public] [Shared] [Function] MethodName (Byval Argument As DataType, ...) As DataType
'// ...
Return Value
End Function
End Class
內功心法九:
我想Inheritance也應該是所有VB程式員夢寐以求的另一突破!在過去的VB6程式裡是不能真真做到這一點(也只有C/C++才能做到),現在VB.NET就把它一一的實現了。也把所有用VB的程式員帶到一個新境界。我想先講解一下何為Inheritance會對以後的Class程式設計比較有協助。
那就拿圖一來做個例子。“人物”稱為Base Class,因為它擁有每個人物應用的屬性(身高,軆重,膚色),方法(站,坐,跑,跳),事件(痛,哭,笑)。如果用此“人物”(Base Class)演變出兩個新的人物(Derived Class)而命名為“學生”和“教師”;那此演變也就叫Inheritance了。因為它把所有“人物”的基本屬性,方法和事件一一應用在兩個新人物“學生”和“教師”裡。Inheritance的好處就是可以很有效率的把Base Class的屬性,方法和事帶到Derived Class裡(沒有更改)而不需要重冩那麼浪費資源。
基本上當開始冩一個Class時(內功心法一)就可以用NotInheritable和MustInherit關鍵字來代表該Class是否能Inherit或者一定要Inherit才可以用(也就是該Class不能用New語法來實例);而一般Class都是默認Ineritable。
不能Inherit的Base Class:
Public [NotInheritable] BaseClassName
'// ...
End Class
一定要Inherit才能使用的Base Class:
Public [MustInherit] BaseClassName
'// ...
End Class
內功心法十:
Polymorphism可以説是Object Oriented編程的最高境界,它也是Inheritance(內功心法九)的另一個突破。這簡直是VB程式員的渴望啊。。。有誰不想學到此境界跟運用在每天悶鬱的工作裡!
Polymorphism有何過人之處?引起人人掙著去學呢?那就要重Inheritance裡説起了。。。我們知道在用Inheritance可以很又效率的由Base Class去演變出一個Derived Class;而不費一分一毫就能完完全全擁有Base Class的屬性,方法和事件。但是。。。但是。。。往往很多時後,現有的方法(Method)裡面的源代碼未必適合每一個Derived Class;就這樣。我們需要Polymorphism來補救了。也就是説Polymorphism使我們能夠去改冩某一個方法(Method)裡的源代碼!是不是很好完呢?
要用Polymorphism此功能,我們先要有一下兩個條件:
其一,要有一個heritable或MustInherit的Base Class。
Public [MustInherit] BaseClassName
'// ...
End Class
其二,要又一個Overridable的方法(Method)。
Public [MustInherit] BaseClassName
[Public] [Overridable] [Sub] MethodName (Byval Argument As DataType, ...)
'// ...
End Sub
[Public] [Overridable] [Function] MethodName (Byval Argument As DataType, ...) As DataType
'// ...
Return Value
End Function
End Class
有了所説的兩點,那就可以開始Polymorphism所的方法;只需稍微加添Overrides關鍵字來表示該方法(Method)是一個Overrided方法(Method)就可以了。
Public [MustInherit] BaseClassName
[Public] [Overrides] [Sub] MethodName (Byval Argument As DataType, ...)
'// ...
End Sub
[Public] [Overrides] [Function] MethodName (Byval Argument As DataType, ...) As DataType
'// ...
Return Value
End Function
End Class
雖然不是聊的很深,當你讀完這十項內功心法也希望對你日常編冩程式稍微有協助。