Office中国论坛/Access中国论坛
标题:
浅谈类模块之二——确定要装的B
[打印本页]
作者:
roych
时间:
2018-8-17 11:42
标题:
浅谈类模块之二——确定要装的B
[attach]62719[/attach]
根据
前面的论述
,类模块是一个逼格很高的东西。所以装逼是必不可免的。如何优雅地装逼,将是下面要提到的。前面说了,使用这口箱子(类模块),就需要我们最终想要的是什么东西(类模块实例),最后再由这些东西来确定往箱子里装什么(类模块属性、方法)。
下面,我们将以最常用的登录模块来创建一个类模块。在这过程中,我们将会把这个类模块进行分解,最后达到功能的实现。现在,我们来回答这几个问题:
1、登录模块需要什么?——用户名、密码
2、登录模块需要哪些功能?——登录。
当然这是最基础的。我们可以继续扩展一下,假定我们增加一个注册功能、一个忘记密码功能。那么注册时就需要填写提示问题、问题答案。忘记密码时,同样需要通过用户名和问题答案来证明,是否该用户,从而提供重置密码功能。因此扩展后的答案如下:
1、用户名、密码、问题、答案。
2、登录、注册、忘记密码、重置密码
这就回答了上面的问题。第一个问题是确定类模块的属性、第二个答案确定类模块的方法(或者事件)。确定了两点之后,我们新建一个类模块,重命名为clsLogin,开始编写代码:
Private locUserName As String
Property Get userName() As String
userName = locUserName
End Property
Property Let userName(ByVal strUserName As String)
locUserName = strUserName
End Property
复制代码
接下来,新建一个标准模块,进行测试,看看能不能运行:
Sub test()
Dim loginObj As clsLogin
Set loginObj = New clsLogin
loginObj.userName = "test"
Debug.Print loginObj.userName
End Sub
复制代码
我们可以看到,在立即窗口里可以看到,已经打印出“test”了。也就是说,这个类模块的“username”属性已经建立起来了。
[attach]62720[/attach]
接下来,开始解释几个疑问:
1、为什么要定义locUserName?
2、Let和Get有什么区别?
3、能不能设置loginObj.userName = Null?
按我的理解(如有偏颇,欢迎指出),回答如下:
1、定义locUserName是为了传值。也就是说,当你创建一个类模块实例时,数据将从let语句由
strUserName传递给
locUserName,再由get语句获取数据。打个比方,你说要做一个凳子,高80公分。你首先要跟木工说,我要一个凳子,80公分。然后木工去锯木头,打造一把80公分高的凳子。如果没有木工,那凳子怎么做?所以这个locUserName相当于木工的作用。
2、根据前面的回答Let和Get的区别其实已经很明显了。Get是为了获取属性,因此需要定义数据类型。而Let是一个传值过程,并不需要数据类型(实际上如果定义了数据类型也会出错)。一些书籍上会介绍,用function来对应Get,用sub对应Let/Set(对,这个没提及,这个一般对应一个对象,用得相对少一些)。
3、不能设置为Null。请参考回答1。你不能告诉木工,我要一个凳子,但我不要高度,你让木工怎么处理?——不要高度是多高?一个没有高度属性的凳子是什么样的凳子?没人能够回答。因此,从这一点看,使用类模块就要避免出现Null的可能。也就是说,类模块是不会帮你处理属性为Null的情况的,只要属性为Null就出错,也就谈不上使用了。
了解完这些之后,我们把剩下的代码补充完整。最终结果如下:
Private locUserName As String
Private locPassword As String
Private locQuestion As String
Private locAnswer As String
Property Get userName() As String
userName = locUserName
End Property
Property Let userName(ByVal strUserName As String)
locUserName = strUserName
End Property
Property Get password() As String
password = locPassword
End Property
Property Let password(ByVal strPassword As String)
locPassword = strPassword
End Property
Property Get question() As String
question = locQuestion
End Property
Property Let question(ByVal strQuestion As String)
locQuestion = strQuestion
End Property
Property Get answer() As String
answer = locAnswer
End Property
Property Let answer(ByVal strAnswer As String)
locAnswer = strAnswer
End Property
复制代码
详细请参考附件[attach]62721[/attach]
浅谈类模块之一——从一口箱子谈起
浅谈类模块之三—我这儿有本秘笈
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3