首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

类属性只能赋值一次的真正实现

各位朋友好,我们今天继续关注二师兄的成长之路。在上一讲中,我们讲了用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 LetName(lnName As String)

If Len(lnName)

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就不再能通过了。这样就彻底的保证了出生日期属性只能写一次。

特别注意点:这里必须使用静态变量,因为一般的变量在赋值子程序执行完毕后,值就被丢弃了。静态变量能将值一直保留在内存中,直到整个类对象被释放为止。

出生日期的赋值属性搞定以后,我们来考虑一下它的读取属性。我们读取一个日期,很多情况下,都是需要把它显示出来,日期的显示有很多的格式,例如2019年7月22日,2020年07月22日,2019-7-2,2020/7/2,2019/07/02等等。我们可以在读取属性的同时将它的显示格式也确定下来。我们用字符串类型来返回读取属性。

代码如下:

Public Property Get DOBA() As String

DOBA = Format(myDOB,"YYYY年mm月dd日")

End Property

代码解读:看到我上面的代码,细心的朋友会发现,老师,怎么又多了一个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代码解决方案之视频是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。

第五套:VBA中类的解读和利用这是一部高级教程,讲解类的虚无与肉身的度化,可以对促进自己理论的提高。

学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。我的上述教程是我多的经验的传递,大家可以根据1,3,2,5或者是4,3,2,5的顺序逐渐深入的逐渐学习。

最后将一阙词送给致力于VBA学习的朋友:

浮云掠过,暗语无声,唯有清风,惊了梦中啼莺。

望星,疏移北斗,奈将往事雁同行。

阡陌人,昏灯明暗,忍顾长亭。

多少VBA人,暗夜中,悄声寻梦,盼却天明。

怎无凭!

分享成果,随喜正能量

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200530A02AC200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券