类是如何被定义的特性及几个要素(类属性的灵活读取设置)

【分享成果,随喜正能量】 大鹏一日同风起,扶摇直上九万里。只要心中有梦想,就会有勇往直前的动力,更会有排除万难的勇气!

《VBA中类的解读及应用》教程是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。

类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入,有必要理解这些抽象的理论知识。对象,类,过程,方法,属性,事件,接口,接口如何实现等等。掌握了这些理论,不仅对于VBA这种寄生语言的实质有所深入的理解,也对自然界的很多事物将同样有所感悟。目前,这套教程程序文件已经通过32位,64位两种office系统测试。

这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是第31讲:类属性的灵活读取设置

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(1)

第三十一讲 类属性的灵活设置----“二师兄”的成长历程之三

各位朋友好,今日我们继续关注“二师兄”的成长,所谓成长,就是一个历程,是一个不断完善自我,不断充实自我的过程。在上一讲中,我们谈到类属性不允许修改的问题,其实这个问题是非常重要的,核心的参数我们要保留自己的修改权,是不能让他人左右的。

1 防止类的使用者随意修改类的属性

为了阻止类的外部使用者,如标准模块1中的代码,随意来修改Pigsy类的Gender属性,我们要学会使用另外一种定义类的属性(Property)的办法。

首先,我们将Public Gender As String 改为Private myGender As String。

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(2)

这样性别属性就被保护起来,外部使用者无法直接访问了。在我的代码中很多朋友会看到变量的命名都是以my来开始的,这也是我的习惯吧,如myModule,这是向他人说明这个模块是我的,那么变量也是我自己使用的。就是这么简单,没有其他的含义。这样,当myGender这个变量出现在代码的其他地方时,我们一看前缀“my”就知道这是一个我自己定义的变量。或者在若干年后,自己的代码水平提高后,或许不会承认自己曾经写过之前天真低级的代码,但变量的命名规则确实是自己的规则。

2 类属性的灵活读取设置

现在类的外部使用者再也不能直接访问修改myGender变量了,可我们还是希望外部访问者能获取性别方面的信息,那该怎么弄呢?我们需要学习类模块中对于属性设置的另外的方法了:

Public Property Get

Public Property Let

Public Property Set

这三个语句在之前也给大家讲解过,我们再来回顾一下:Public是公有的意思,有了它,类的外部使用者才能访问。Property是属性的意思。Get是获取,Let是赋值(set是针对对象的赋值)。所以 Public Property Get是获取类的某个属性,Public Property Let是给某个属性赋值。

下面我们修改Pigsy类的代码如下:

Public Name As String

Private myGender As String

Public Situation As String

Public Sub Speak()

Select Case Situation

Case "师父"

MsgBox "八戒"

Case "师兄"

MsgBox "八戒"

Case "非正式"

MsgBox "呆子"

Case "师弟"

MsgBox "二师兄"

Case Else

MsgBox "天蓬元帅"

End Select

End Sub

Private Sub Class_Initialize()

Situation = "师兄"

End Sub

Public Property Get Gender() As String

Gender = myGender

End Property

Public Property Let Gender(inGender As String)

If myGender = "" Then

myGender =inGender

Else

MsgBox "对不起,二师兄不能做性别修改"

End If

End Property

代码解析:上述代码,为类定义了一个获取性别(Gender)的属性。我们直接将类的私有变量myGender的值直接返回给访问者。代码为类定义了一个设置性别(Gender)值的属性。当你给性别赋值的时候,首先会检查myGender的值是否为空字符串,如果是,就直接赋值。如果不是,说明之前已经被赋值过了,就弹出对话框提示不能修改。

  • 说明:实际项目中,一般不会用对话框来提示类的使用者,而是通过触发一个事件的方式来与类的使用者做信息的传递。

这样,性别属性就不再让类的外部使用者随意修改了。你只能为性别赋值一次,你可以叫这种属性为“只写一次属性”。

3 “只写一次属性”在程序中的应用

我们来看看类的使用效果,在模块1中,我们修改代码如下:

Sub MYNZ_31()

Dim objpigsy As pigsy

Set objpigsy = New pigsy

objpigsy.Name = "猪悟能"

objpigsy.Gender = "男"

objpigsy.Speak

MsgBox "修改前性别:" & objpigsy.Gender

objpigsy.Gender = "女"

MsgBox "修改后性别:" & objpigsy.Gender

End Sub

代码解析:mynz过程中首先将给Gender赋值,然后提示用户修改前的Gender,之后进行修改,会提示给用户这个属性是不能修改的,并通过提示给予验证。

类模块截图:

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(3)

标准模块截图:

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(4)

下面我们看看代码执行过程中的提示框:

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(5)

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(6)

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(7)

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(8)

通过这种方式来定义类的属性,我们既能够保护类的私有变量不受到外部使用者的随意修改,也能够提供在我们允许的情况下访问和修改类属性的途径。

作为VBA开发人员,要深入的领会这种属性设置的意义,比如,如果在类中,将Public Property Get去掉,只保留Public Property Let会怎么样?或者反过来,将Public Property Let去掉,只保留Public Property Get又会怎么样?同时我们要注意严谨性,上述文章中提到的“只写一次属性”,但是如果你第一次将性别赋值为空字符串“”,那么你第二次还能再赋值。如果要设计一个真正的“只写一次属性”,你该怎么做?这些问题都是值得我们思考的。

今日内容回向:

1 本讲的“二师兄”有哪些属性发生了改变?

2 “只写一次属性”本讲是如何实现的?

本讲内容参考程序文件:VBA-CLASS(31).xlsm

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(9)

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

类是如何被定义的特性及几个要素(类属性的灵活读取设置)(10)

【分享成果,随喜正能量】存为善之心,不必邀为善之名。善良,不是居高临下的施舍,而是不动声色的善待,是尽己所能的回馈。你的善良,不必高声宣扬,善良的人,必定自带光芒。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页