VBA中类的解读及应用第三十四讲 枚举的利用----“二师兄”的成长历程之六
《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。
类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入,有必要理解这些抽象的理论知识。对象,类,过程,方法,属性,事件,接口,接口如何实现等等。掌握了这些理论,不仅对于VBA这种寄生语言的实质有所深入的理解,也对自然界的很多事物将同样有所感悟。目前,这套教程程序文件已经通过32位,64位两种office系统测试。
这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是VBA中类的解读及应用第三十四讲 枚举的利用----“二师兄”的成长历程之六
【分享成果,随喜正能量】生活就像是一杯苦茶,而情感是茉莉花,调兑在一起,才会馥郁芬芳。人活在世上,有诸多苦楚萦心,若不懂得自我调解,终究会被纷呈的世相掩埋。所以,更多的时候,我们要淡看事世,只有这样,才可淡然前行,自在清明。
第三十四讲 枚举的利用----“二师兄”的成长历程之六
大家好,今日继续类的讲解,到上一讲,我们的pigsy类的羽翼已经逐渐丰满,本篇的内容将让它变得更加专业。
不知道你注意到没有,pigsy类中对Gender(性别)属性的设计存在一点缺陷:我们用私有模块级字符串变量myGender宿主来保存性别数据,既然是一个字符串变量,那就可以往里面保存任何字符串数据,比如“女”,“女性”,“Female”,“男”,“男性”,“male”。虽然字面上都是可以理解的意思,但是写法上都不相同,你无法控制使用者会给myGender赋什么值,这样就会造成信息处理和判断上的混乱。作为一个较为专业的类的设计者,我们要提供一套规范的取值范围。
在上面的文字中,我提到了六个取值,这些值可以说是一个相对固定的常量,我们可以在类中使用像这种固定的常量名称,这种在类中使用常量的方式是非常普遍的。现在我们就来介绍如何在自己的类中使用这种常量。
1 枚举类型(Enumeration)的应用
这种常量实际上是枚举类型(Enumeration)中的一个值。我们在pigsy类的头部,为性别属性定义一个枚举类型pGender:
Public Enum pGender
Female
Male
End Enum
这里的枚举是pGender,其中“p”代表类名“pigsy”我们定义的是公有的(Public)枚举类型,这个枚举类型在整个项目范围内都是可见的,将类名缩写作为前缀有利于与其他类中的枚举类型相互区分。
特别注意点:一般的常量在定义的时候,需要给定一个常量值,可以为各种类型,比如Const PI As Double = 3.14,就是双精度型。但是枚举类型常量很特殊,它只能是长整形(Long)比如Female = 0。但是我们这里连“=0”都没有写。如果什么都没写,叫表示“从0开始,依次加1”,所以上述代码与下述代码是一样的:
Public Enum pGender
Female = 0
Male = 1
End Enum
好了,枚举类型的定义就介绍到这里。我们来看看如何使用它。
可以用Select Case 语句控制返回的枚举值
2 枚举在代码中的实际应用
有了pGender这个类型,我们就可以将性别属性定义为这种类型了。我们将
Private myGender As String 改为Private myGenderA As pGender,将Gender的读写属性做相应修改,相关代码最后效果如下:
Private myGenderB As pGender
Public Enum pGender
Female = 0
Male = 1
End Enum
Public Property Get Gender() As pGender
Gender = myGenderA
End Property
Public Property Let Gender(inGender As pGender)
Static myFlag As Boolean
If myFlag = False Then
myFlag = True
myGenderA = inGender
Else
MsgBox "对不起,二师兄不能做性别修改"
End If
End Property
类修改枚举部分的代码截图:
有了这些修改以后,我们在类的测试代码中,就会发现不一样的效果了,如下图:
通过以上的修正,类的使用者(模块1中的测试代码)在给性别赋值的时候,IDE的智能提示就会自动显示出来,供其选择。
类中的枚举常量使用起来非常简单,但是它极大地增加了类的友好性,也是开发人员专业性的直观体现。是一项投资回报率非常高的技能。
今日内容回向:
1 本讲中讲了枚举,读者是否明白了?
2 本讲的代码中类的属性是否发生了改变?
本讲内容参考程序文件:VBA-CLASS(34).xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中:
