国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VB.net入門(10):補充:類~屬性

2024-07-10 13:01:01
字體:
來源:轉載
供稿:網友
剛剛發(fā)現類還沒有寫完,還有一個比較大的部分:屬性(property)。

property在java和c++里面都是聞所未聞的。通常認為類當中只要有成員和方法就行了。至于屬性呢,當使用的時候,屬性看起來就像成員,屬性和成員有很多相似之處。但是屬性有更多獨特之處,它可以說是vb的一大特色。我的理解就是屬性是為了更好的對成員進行處理而存在的。

屬性是這樣一種東西,它看起來像是成員,但本質上它是函數。屬性的定義是這樣的:
public property myproperty() as object 'myproperty是屬性的名字
get '這個地方不能打括號
return mvarmyproperty
end get

set(byval value as object)
mvarmyproperty = value
end set
end property

可以看到,屬性其實是由兩個函數組成的:get 和 set()。當我們讀取屬性的時候,它就調用get,所以get里面必須有return語句;當設置屬性的時候,它就調用set(),所以set()是帶參數的。當外界讀取myproperty的時候,myproperty就返回mvarmyproperty。mvarmyproperty是事先聲明好的變量。當外界設置myproperty的時候,所賦的值就賦給mvarmyproperty。在這里,mvar-是vb6中缺省使用的前綴,表明這是一個存放屬性的變量。

到這里你可能理解了,屬性本身不保存數據,它通過另一個變量來讀寫。但是這又是一件奇怪的事:有必要這么麻煩嗎?我直接寫:
public myproperty as object

不是更簡單嗎?
這里有一個簡單的解釋:通過property,我們可以隱藏真實的成員,比如mvarmyproperty我們就可以定義為:
private mvarmyproperty as object

這樣一來,外界就看不到mvarmyproperty,只能看到myproperty。當外界對其進行讀寫的時候,中間就有一個處理過程,用來避免對成員的不正確的賦值。其實對于這種情況,java和c++也有類似的做法,就是使用setmyproperty()函數和getmyproperty()函數。vb用property這種特殊的格式將它們做到一起,顯得更簡單方便了。

好了,到這里,你不想看看完整的例子嗎?這里重新寫了一個human類,當中有一個age(年齡)屬性。我們看看它是怎樣阻止把一個人的年齡設為負值的:
imports system

public module mymodule
sub main
dim laowang as new human
laowang.name = "老王"
laowang.age = 52
laowang.age = 330 '這句話有沒有把老王的年齡設為330歲呢?看看下一句的結果就知道了。
console.writeline("{0}現在{1}歲。", laowang.name, laowang.age)
console.readline()
end sub
end module

public class human
public name as string
dim mvarage as integer '這里沒有指明是public還是private,因為缺省狀態(tài)是private

public property age() as integer
get
return mvarage
end get
set(byval value as integer)
if value<=0 or value>=200 then '通常年齡不應該小于1或大于200
console.writeline(value & "歲?我死了嗎?")
else
mvarage = value
end if
end set
end property
end class

到這里你應該閉目養(yǎng)神一會兒:原來屬性是這樣子的啊!








但是話題還沒有完。

比如說,如果成員是一個數組,我該怎樣為它建立屬性呢?為當中的每一個元素建立嗎?那數組大小變化了怎么辦?property才不會這么蠢。我們舉個例子。比方我們給human類添加一個數組成員children,表示一個人有多少個孩子。我們先定義mvarchildren:
dim mvarchildren() as human

為其建立屬性有兩種方式。一種是直接將屬性的類型設為數組:
public property children() as human()
get
return mvarchildren
end get
set(byval value as human())
mvarchildren = value
end set
end property

那么我們就可以像使用數組一樣來使用這個屬性了。

另一種是在讀取屬性的時候傳入參數index:
public property children(byval index as integer) as human
get
return mvarchildren(index)
end get
set(byval value as human)
mvarchildren(index) = value
end set
end property

這樣可以對傳入的下標進行檢查。
這里提到讀取屬性的時候可以給參數。這是很有趣的一個東西。比如老王有3個小孩,其中一個叫“王華”。我想根據名字來得到這個小孩,我可以寫一個函數
public function getchildbyname(byval name as string) as human '內容省略了

然后調用
laowang.getchildbyname("王華")

就可以了。
要寫成屬性的話,我們可以這樣寫:
public property child(byval name as string) as human
get
return getchildbyname(name)
end get
set(byval value as human)
getchildbyname(name) = value
end set
end property

這樣,我們就可以直接使用:
laowang.child("王華").age = 20

這樣是不是很方便啊?





收集最實用的網頁特效代碼!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 江口县| 名山县| 姚安县| 通江县| 玉山县| 福安市| 全南县| 邻水| 连平县| 济宁市| 新营市| 怀安县| 牙克石市| 通许县| 湘潭市| 延庆县| 河池市| 西平县| 乐陵市| 砚山县| 南丰县| 龙泉市| 东山县| 崇信县| 泉州市| 长泰县| 汪清县| 天门市| 平潭县| 太原市| 弥渡县| 宣城市| 松桃| 葵青区| 高邮市| 迁西县| 南阳市| 桐城市| 镇巴县| 阿合奇县| 壤塘县|