国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 辽中县| 曲水县| 元朗区| 绿春县| 区。| 京山县| 罗定市| 沙湾县| 瑞安市| 广东省| 河津市| 砀山县| 肥乡县| 彭州市| 洪泽县| 常熟市| 达尔| 衡山县| 响水县| 客服| 盐亭县| 江城| 桐柏县| 青川县| 德令哈市| 敦化市| 兴宁市| 慈利县| 忻城县| 广元市| 乌兰浩特市| 临清市| 兴城市| 陵川县| 宁南县| 杨浦区| 平湖市| 平邑县| 阳山县| 余庆县| 马山县|