VB.NET的Object Oriented编程内功心法。

(華版)

每當我們提到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

雖然不是聊的很深,當你讀完這十項内功心法也希望對你日常编冩程式稍微有帮助。


posted on 2005-03-07 14:43  克仔  阅读(2946)  评论(8编辑  收藏  举报