设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2215|回复: 0
打印 上一主题 下一主题

[其它] 浅谈类模块之二——确定要装的B

[复制链接]
跳转到指定楼层
1#
发表于 2018-8-17 11:42:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



      根据前面的论述,类模块是一个逼格很高的东西。所以装逼是必不可免的。如何优雅地装逼,将是下面要提到的。前面说了,使用这口箱子(类模块),就需要我们最终想要的是什么东西(类模块实例),最后再由这些东西来确定往箱子里装什么(类模块属性、方法)。

      下面,我们将以最常用的登录模块来创建一个类模块。在这过程中,我们将会把这个类模块进行分解,最后达到功能的实现。现在,我们来回答这几个问题:
      1、登录模块需要什么?——用户名、密码
      2、登录模块需要哪些功能?——登录。
      当然这是最基础的。我们可以继续扩展一下,假定我们增加一个注册功能、一个忘记密码功能。那么注册时就需要填写提示问题、问题答案。忘记密码时,同样需要通过用户名和问题答案来证明,是否该用户,从而提供重置密码功能。因此扩展后的答案如下:
      1、用户名、密码、问题、答案。
      2、登录、注册、忘记密码、重置密码
      这就回答了上面的问题。第一个问题是确定类模块的属性、第二个答案确定类模块的方法(或者事件)。确定了两点之后,我们新建一个类模块,重命名为clsLogin,开始编写代码:
  1. Private locUserName As String
  2. Property Get userName() As String
  3.     userName = locUserName
  4. End Property

  5. Property Let userName(ByVal strUserName As String)
  6.     locUserName = strUserName
  7. End Property
复制代码
     接下来,新建一个标准模块,进行测试,看看能不能运行:
  1. Sub test()
  2.     Dim loginObj As clsLogin
  3.     Set loginObj = New clsLogin
  4.     loginObj.userName = "test"
  5.     Debug.Print loginObj.userName
  6. End Sub
复制代码
     我们可以看到,在立即窗口里可以看到,已经打印出“test”了。也就是说,这个类模块的“username”属性已经建立起来了。

      接下来,开始解释几个疑问:
      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就出错,也就谈不上使用了。

      了解完这些之后,我们把剩下的代码补充完整。最终结果如下:
  1. Private locUserName As String
  2. Private locPassword As String
  3. Private locQuestion As String
  4. Private locAnswer As String

  5. Property Get userName() As String
  6.     userName = locUserName
  7. End Property

  8. Property Let userName(ByVal strUserName As String)
  9.     locUserName = strUserName
  10. End Property

  11. Property Get password() As String
  12.     password = locPassword
  13. End Property

  14. Property Let password(ByVal strPassword As String)
  15.     locPassword = strPassword
  16. End Property

  17. Property Get question() As String
  18.     question = locQuestion
  19. End Property

  20. Property Let question(ByVal strQuestion As String)
  21.     locQuestion = strQuestion
  22. End Property

  23. Property Get answer() As String
  24.     answer = locAnswer
  25. End Property

  26. Property Let answer(ByVal strAnswer As String)
  27.     locAnswer = strAnswer
  28. End Property
复制代码
     详细请参考附件     浅谈类模块之一——从一口箱子谈起
     浅谈类模块之三—我这儿有本秘笈



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-26 22:29 , Processed in 0.099724 second(s), 25 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表