對于復雜的操作設計解決方案,必須首先確定組成這個系統的對象,在vb中,我們常常把每個對象的屬性和操作組合到一個類里面,類的定義如下:
class classname
'屬性和操作
end class
一個完整的例子:
class classname
dim a as string
dim b as integer
dim c as string
sub op()
end sub
sub cl()
endsub
endclass
類的定義本身不產生變量,定義之后可以使用new操作符來產生變量
dim variable as classname
變量定義后可以使用點運算符來引用
variable.a = 'test'
創建類的時候,應當把類設計成一個“黑匣子”,就像電視機一樣我們不需要了解電視機的組成和原理,直接用就可以了,可以隱藏類的私有類成員和方法,
用來控制類成員訪問的修飾符
friend : 只在當前項目中可用
private : 只在本類中可用
protected : 在本類和本類的派生類中可用的成員
protected friend:在當前項目和本類的派生類中可用
public :類以外的代碼也可以訪問
默認值為:public
類成員的初始化:
創建類的對象的時候,通常立即賦值,為了簡化賦值的操作,可以放入專門的子例程,即構造器,在任何類定義中,它都叫做new,例如:
class book
public title as string
public publisher as string
sub new()
me.title=title
me.publisher=publisher
end sub
end class
如果要簡化對象成員的引用可以使用with運算符
在創建類的時候,可能經常需要對類的變量賦值進行限制,例如,年齡,為了實現對類變量賦值的限制,可以在變量定義的時候使用private,例如
module module1
class book
public title as string
public author as string
private price as double
public property bookprice() as double
get
return price
end get
set(byval value as double)
if (value >= 0) and (value <= 100) then
price = value
else
msgbox("error")
price = 0
end if
end set
end property
public sub new(byval title as string, byval author as string)
me.title = title
me.author = author
end sub
end class
sub main()
dim p as new book("os ap", "hans")
p.bookprice = 490
console.readline()
end sub
與構造器對應的方法是析構器,方法是finalize子例程
一下是msdn中對此的詳細解釋:
每當創建類的實例時,如果該對象中存在名為 new 的過程,則公共語言運行庫 (clr) 嘗試執行它。new 是一種稱為“構造函數”的過程,該構造函數用于在對象中的任何其他代碼執行之前初始化新對象。new 構造函數可用于打開文件、連接到數據庫、初始化變量以及處理任何需要在可使用對象前完成的其他任務。
當創建派生類的實例時,基類的 sub new 構造函數首先執行,然后執行派生類中的構造函數。這是因為 sub new 構造函數中的第一行代碼使用語法 mybase.new() 調用類層次結構中該類本身緊上面的類的構造函數。然后調用該類層次結構中每個類的 sub new 構造函數,直到到達基類的構造函數。此時,基類構造函數中的代碼執行,接著執行所有派生類中每個構造函數的代碼,最后執行最相近派生的類中的代碼。

當不再需要某對象時,clr 調用該對象的 finalize 方法,然后釋放其內存。finalize 方法稱為“析構函數”,因為它執行清理任務,如保存狀態信息、關閉文件和與數據庫的連接,以及執行在釋放對象前必須完成的其他任務。
當調用派生類的 sub finalize 方法時,首先執行所需的任何清理任務,然后使用語法 mybase.finalize() 顯式調用其基類的 sub finalize 方法。因此,sub finalize 方法首先從最相近派生的類開始運行,最后執行基類中的代碼。

一旦涉及到finalize方法,垃圾收集器就不能不提到,在.net環境中,由垃圾收集器來管理內存,在vb.net中,告訴垃圾收集器你的程序不在需要使用某個對象的方法是把對象設置為nothing,如下:
一旦涉及到finalize方法,垃圾收集器就不能不提到,在.net環境中,由垃圾收集器來管理內存,在vb.net中,告訴垃圾收集器你的程序不在需要使用某個對象的方法是把對象設置為nothing,如下:employee=nothing
在垃圾收集器釋放某個對象之前,首先調用該對象的finalize方法,根據處理的不同,有時從程序中止使用某個對象到某個對象的finalize方法運行之間時間很長,在這種情況下可以在類里放一個dispose的專門方法,用這個方法執行對廢棄對象的處理,當某個對象的內容不需要使用時,調用dispose方法,程序立即執行對象的清理處理,仔細觀察vs生成的窗口代碼,也會發現dispose方法的代碼,如下:
public sub new()
mybase.new()
'該調用是 windows 窗體設計器所必需的。
initializecomponent()
'在 initializecomponent() 調用之后添加任何初始化
end sub
'窗體重寫 dispose 以清理組件列表。
protected overloads overrides sub dispose(byval disposing as boolean)
if disposing then
if not (components is nothing) then
components.dispose()
end if
end if
mybase.dispose(disposing)
end sub
我們只需要把dispose進行調用就可以了:someclass.dispose
新聞熱點
疑難解答
圖片精選