随笔-86  评论-180  文章-1  trackbacks-4

(華版)

每當我們提到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 克仔 阅读(1666) 评论(8)  编辑 收藏 网摘 所属分类: .NET心得

评论:
#1楼  2005-03-07 19:22 | sumtec      
你的Post我估计不少人阅读起来会比较别扭,专业术语不相通……

前一阵子听几个新加坡来的人聊天,说他们国内基本上用英语沟通,但是来这边外排工作就要学习中文……主要是技术术语。其中一个先来的大陆,再去了台湾,在台湾跟人家说这个“程序”,人家Ft,听不懂为何物,人家叫作“程式”。说“软件”,又Ft,叫“软体”。后来再说“源代码”,狂Ft,抓耳挠腮憋了半天才搞懂,原来叫作“Source code”……竟然没有中文的称呼,怪哉。

虽然我觉得怎么叫都无所谓,但是很多时候我还是觉得大陆的术语可能更加科学一点点。好比说“函式(Method)”,就觉得挺怪的,因为从含义上来说,应该就是指“方法”,不太明白为什么要创造一个新的词出来。呵呵,纯粹学术讨论,没有任何歧视成分。

楼主觉得呢?有时候真想搞清楚诸如“软体”、“函式”这些翻译名称是如何定出来的,或者有没有什么解释?我没有接触过,恕我孤陋寡闻,请多多包涵。
  回复  引用  查看    
#2楼  2005-03-07 22:20 | 奋斗中的灵感之源      
台湾的人真变态,不但技术的,连国语发音都改了,其实就改了5个基本音,但大家都变成娘娘腔了,恶心死了。
  回复  引用  查看    
#3楼  2005-03-07 22:44 | 克仔      
因為曾經讀過來自中國和台灣出版的技術書;所以當要用到這些技術術語就會出先混亂了。。。:p 要讀者别扭真不好意思哦,會繼續得學习學习~

  回复  引用  查看    
#4楼  2005-03-07 23:02 | 克仔      
謝謝sumtec的提點,已將“函式”(Method)修改去“方法”了。

  回复  引用  查看    
#5楼  2005-03-08 08:10 | bill [未注册用户]
數據庫==>資料庫
變數==>變量
物件==>控件
程式==>程序
函式==>函數
軟體==>軟件
硬體==>硬件
硬碟==>硬盤
......
  回复  引用    
#6楼  2005-03-08 08:34 | gates [未注册用户]
簡直就是胡說八道,連什麼叫類,什麼叫對象,類與對象的關係都搞不清楚,還在這裡賣弄,丟人呀。。。。

  回复  引用    
#7楼 [楼主] 2005-03-08 15:33 | 克仔      
謝謝Bill的提點:)

剛剛找到一個“大陸”和“台湾”的技術術語翻译網页(http://www.soft086.com/printpage.asp?ArticleID=404)。然後就修改了《VB.NET的Object Oriented编程内功心法》里的技術術語錯誤,希望大家不再有阅读的困难。

努力!努力!

  回复  引用  查看    
#8楼  2005-03-12 18:33 | KK Lim [未注册用户]
Nothing wrong with 克仔 because different countries have thier own computer terms indeed especial Taiwan and China. As long as 克仔 has the remark with the english terms beside the chinese terms.

克仔 i like this article. good!

Note.: Sorry i don't have chinese input in my OS, thus i force to use English.

Remark: 克仔 also has another good article in http://www.codeproject.com/ce/fullscreen.asp.

  回复  引用    




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-03-08 16:31 编辑过
Google站内搜索

相关文章:

相关链接: