各位朋友好,我們今天繼續關注二師兄的成長之路。在上一講中,我們講了用property get 和 property let(set)定義類的屬性,這樣可以獲得更多的靈活性,在我們的類pigsy中有gender(性別)屬性使用了這種定義方式,本講,我們將繼續完善其他類的屬性,同時給大家揭示更多關於類的屬性方面更深層次的問題。雖然有一定的難度,我盡可能把這些內容以非常容易的方式講解給大家。
一 name(姓名)屬性我們將它的宣告按照gender屬性的方式從public(公有)改為private(私有),同時使用變數命名規則將name改名為myname。如下的**:
private myname as string
有了這樣的乙個私有模組級變數後,我們就有了乙個儲存屬性資料的宿主(或者稱之為容器)接下來,我們要定義name(姓名)的讀取屬性(property get)
public property get name() as string
name = myname
end property
其實這裡**的意義就是將宿主myname中的資料傳遞給name的過程。
接下來我們為name(姓名)定義賦值屬性(property let)。設計之前,我們要考慮下,是否要對name賦值的時候,做任何約束。比如,是否要檢查一下賦值的有效性?一般中國人的姓名都在4個字以下,對超過4個字的情況,是否要彈出錯誤提示框?另外,姓名被賦值一次後,是否允許再被第二次賦值?這些都是在設計之前要考慮的問題。這裡我們就只檢查一下超過4個字的情況。
public property let name(lnname as string)
if len(lnname) <= 4 then
myname = lnname
else
msgbox "姓名不能超過4個字元"
end if
end property
**截圖:
**的解析:上述**為name屬性賦值,賦值是將乙個變數傳遞進來,所以我用了lnname這樣的變數作為傳入的資料,傳入資料後我要對資料進行校驗。如果校驗通過,那麼將傳進來的資料放到宿主中,以便在讀取的時候取出。如果不通過則提示給使用者資訊。
二 新增乙個dob(出生日期day of birth)屬性
為了讓我們的pigsy類更加接近現實,我們給它新增另外乙個日期類的屬性:dob是指出生日期(day of birth的縮寫)。同樣我們定義乙個變數(大家要記住這個變數是宿主,或者叫容器,目的就是為了在類模組中裝一下資料)如下
private mydob as date
我們順便可以考慮一下上節我們提到的「只賦值一次」的問題,考慮給出生日期定義賦值屬性,這裡,我們要實施真正的「只賦值一次」。我們不能依賴mydob的值去判斷是否已經賦過值了,因為我們可以賦乙個零值。在實際專案中,我們要使用布林(boolean)變數作為是否賦過值的標誌(flag)。
出生日期的賦值屬性定義如下:
public property let dob(lndob as date)
static myflag as boolean
if myflag = false then
myflag = true
mydob = lndob
end if
end property
**解析:我們使用靜態(static)布林變數myflag作為乙個開關,所有布林變數的初始值都為否(false),所以第一次給出生日期賦值的時候,myflag為false,判斷條件myflag=false獲得通過,緊接著將這個開關的值設定為true,然後將新的出生日期賦值給模組級的私有變數宿主mydob。第二次給出生日期賦值的時候,靜態變數myflag的值是true,判斷條件myflag=false就不再能通過了。這樣就徹底的保證了出生日期屬性只能寫一次。
特別注意點:這裡必須使用靜態變數,因為一般的變數在賦值子程式執行完畢後,值就被丟棄了。靜態變數能將值一直保留在記憶體中,直到整個類物件被釋放為止。
出生日期的賦值屬性搞定以後,我們來考慮一下它的讀取屬性。我們讀取乙個日期,很多情況下,都是需要把它顯示出來,日期的顯示有很多的格式,例如2023年7月22日,2023年07月22日,2019-7-2,2020/7/2,2019/07/02等等。我們可以在讀取屬性的同時將它的顯示格式也確定下來。我們用字串型別來返回讀取屬性。
**如下:
public property get doba() as string
doba = format(mydob, "yyyy年mm月dd日")
**解讀:看到我上面的**,細心的朋友會發現,老師,怎麼又多了乙個doba的屬性啊?對的,我們特意增加的,那麼為什麼不直接用dob這個屬性呢?這個問題在本講的最後會給大家以解答,這裡可以先思考一下。
這裡dob和doba就是兩個不同名字的屬性,它們都是圍繞著類的私有變數mydob來讀寫。dob只定義成賦值屬性,只能出現在賦值號(=)左邊,否則的話,編譯報錯:屬性的無效使用。doba定義成了讀取屬性,只能出現在賦值號(=)右邊,否則的話,編譯報錯:不能給唯讀屬性賦值。我們也可以將dob理解為只寫屬性,doba理解為唯讀屬性。這樣對於上一講的內容關於使用property get 和 property let(set)的靈活性方面,這講也進行了講解。好了,我們下一講繼續。
1 如何設定真正的「只賦值一次」的屬性?
2 為什麼要引入doba的屬性呢?
在取代office新的辦公軟體沒有到來之前,誰能在資料處理方面做到極致,誰就是王者。其中登峰至極的技能非vba莫屬!學習vba是個過程,如太白詩云:眾鳥高飛盡,孤雲獨去閒。相看兩不厭,只有敬亭山。
「水善利萬物而不爭」,綿綿密密,微則無聲,鉅則洶湧。學習亦如此,知道什麼是自己所需要的,不要蜷縮在一小塊自認為天堂的世界裡,待到暮年時再去做自欺欺人的言論。要努力提高自己,有一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。願力決定始終,智慧型決定成敗。不管遇到什麼,都是風景。看淡紛爭,看輕得失。茶,滿也好,少也好,不要計較;濃也好,淡也好,其中自有值得品的味道。去感悟真實的時間,靜下心,多學習,積累福報。而不是天天混日子,也不是天天熬日子。在後疫情更加嚴峻的存量殘殺世界中,為自己的生存進行知識的儲備,特別是新知識的儲備。學習時微而無聲,利用時則鉅則洶湧。
vba是利用office實現自己小型辦公自動化的有效手段,我記得20年前自己初學vba時,那時的資料甚少,只能看原始碼自己琢磨,真的很難。20年過去了,為了不讓學習vba的朋友重複我之前的經歷,我根據自己多年vba實際利用經驗,推出了五部vba專門教程。
第一套:vba**解決方案是vba中各個知識點的講解,覆蓋絕大多數的vba知識點,初學必備;
第二套:vba資料庫解決方案資料庫是資料處理的專業利器,教程中詳細介紹了利用ado連線accdb和excel的方法和例項操作。
第三套:vba陣列與字典解決方案陣列和字典是vba的精華,字典是vba**水平提高的有效手段,值得深入的學習。
第五套:vba中類的解讀和利用 這是一部高階教程,講解類的虛無與肉身的度化,可以對促進自己理論的提高。
學習的過程也是修心的過程,修乙個平靜的心。在**的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心裡沒有那麼多邪知邪見,也就沒有那麼多妄想。利人就是利己。我的上述教程是我多的經驗的傳遞,大家可以根據1,3,2,5或者是4,3,2,5的順序逐漸深入的逐漸學習。
最後將一闕詞送給致力於vba學習的朋友:
浮雲掠過,暗語無聲,唯有清風,驚了夢中啼鶯。
望星,疏移北斗,奈將往事雁同行。
阡陌人,昏燈明暗,忍顧長亭。
多少vba人,暗夜中,悄聲尋夢,盼卻天明。
怎無憑!
分享成果,隨喜正能量
oracle into 一次給多個變數賦值
建表,插資料 prompt pl sql developer import file prompt created on 2012年5月23日 by administrator set feedback off set define off prompt creating student.creat...
只能例項化一次的類 Singleton
01.class csingleton 02.10.static void release 必須,否則會導致記憶體洩露 11.17.18.19.protected 20.csingleton 21.22.cout csingleton 為了防止從類的外部呼叫建構函式,產生類的新的例項,我們應該把該類...
InputStream只能讀取一次的解決方法
有時候我們需要對同乙個inputstream物件使用多次。但第一次讀取inputstream物件後,第二次再讀取時可能已經到stream的結尾了 eofexception 或者stream已經close掉了。而inputstream物件本身不能複製,因為它沒有實現cloneable介面。此時,可以先...