为什么要在 VBA 类模块中声明新类型?

2023-12-24

我想遵循 MVP 用户表单架构中描述的这个优秀的答案 https://stackoverflow.com/questions/47288496/are-there-disadvantages-in-putting-code-into-userforms-instead-of-modules/47291028作者:马蒂厄·金登。但是,我不明白为什么在 FilterModel 类模块以及 FilterForm 用户表单模块中,在类中创建新类型,然后将其元素重新声明为类的属性。为什么这是必要的?为什么不直接将 SelectedFilter 声明为字符串类型的属性?我错过了什么吗?


大多数属性都需要一个支持字段。通常它看起来像这样:

Option Explicit
Private mFoo As String

Public Property Get Foo() As String
    Foo = mFoo
End Property

Public Property Let Foo(ByVal value As String)
    mFoo = value
End Property

当您在中查看此类的实例时locals工具窗口,您将看到mFoo私人支持领域和公众Foo财产——当班级有多名成员时,很快就会变得吵闹。

另外我真的不喜欢这个m前缀方案,但由于 VBA 不区分大小写,因此您不能有foo的支持场Foo财产。

通过声明一个Private Type保存封装的实例状态...

Private Type InternalState
    Foo As String
End Type
Private this As InternalState

Public Property Get Foo() As String
    Foo = this.Foo
End Property

Public Property Let Foo(ByVal value As String)
    this.Foo = value
End Property

...现在属性及其支持字段可以使用相同的标识符,不需要任何前缀,我们得到所有成员的自动完成列表this,本地工具窗口现在将实例状态值分组到下面this,类中唯一的私有字段,这使得调试工具更加简洁。

这不是一个必要性,但我找不到不这样做的充分理由。这实际上是一种风格/偏好,而不是最佳实践,但它有明显的好处。


为什么不直接将 SelectedFilter 声明为字符串类型的属性?

如果这意味着“为什么不直接宣布公开field字符串类型”,那么这是一个不同的问题,有不同的答案。

每个类定义一个默认界面,其成员是类'Public成员。但接口不公开字段,因此如果类上有公共字段,则其默认接口将具有Property Get and Property Let/Set它的访问器:通过定义显式Property成员而不仅仅是公共字段,您可以使类定义与其默认接口一致。 ..而你封装内部状态 -封装作为 OOP 的 4 个支柱之一:与公开无关的事物就不应该公开。通过属性,您可以控制如何分配支持私有字段:类之外的任何人都无法访问它。也许您需要运行一些验证逻辑,并在外部代码尝试分配时引发错误Foo例如,空字符串或与某些正则表达式模式不匹配的字符串。

使用属性与公共字段的优点超出了这个问题的范围(并且已经在其他地方回答过),但是该主题与语言无关,因此不一定将您的研究限制在 VBA 上:使用的原因(或不是)VBA 中的属性与公共字段与 Java 或 C# 中的相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要在 VBA 类模块中声明新类型? 的相关文章

  • Outlook 中用于删除重复电子邮件的宏 -

    Public Sub RemDups Dim t As Items i As Integer arr As Collection f As Folder parent As Folder target As Folder miLast As
  • 查询从同一表中的另一条记录获取值并按大于间隙阈值的差异进行过滤

    我将数据导入到 MS Access 中的临时表中 如下所示 我添加了需要使用 SQL 查询计算的 Gap 和 Previous Current 列 间隙阈值 是用户输入或范围提供给查询和例如是 300 GlobalID 对 ItemID 进
  • 使用 VBA 在 Access 表中记录计数

    我正在尝试获取表的记录数 如果计数大于 17 则创建一个新表 Dim rst As DAO Recordset strSQL Select from SKUS Set rst db OpenRecordset strSQL If rst R
  • 如果需要函数类型作为类型参数,如何输入 None?

    假设我有一个需要回调的函数 fn foo
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 在打字稿中获取类的键

    我有一个包含很多方法的类 我们称之为 myClass 我这样称呼它 myClass key 有没有办法从 key 获取可能的值 我希望有类似 keyof myClass 的东西 但我得到 myClass 引用一个值 但在这里被用作类型 问题
  • Python函数重载

    我知道 Python 不支持方法重载 但我遇到了一个问题 我似乎无法以一种很好的 Pythonic 方式解决它 我正在制作一个游戏 其中一个角色需要射击各种子弹 但是如何编写不同的函数来创建这些子弹 例如 假设我有一个函数 可以创建一颗以给
  • 使用 VBA 使用另一个表中的值更新访问表

    我在数据库中有两个表 表 1 和表 2 我正在尝试根据表 2 中的数据使用 VBA 代码更新表 1 Example Table 1 PartNo Price Description A 100 B 200 Bad C 300 Table 2
  • 当存储在集合中时,如何更改类属性的值

    我想将一个类存储在集合中 并且能够更改该类的属性 而不必删除集合项并再次将其添加回来 我的研究表明 如果不进行删除 替换操作 则无法更改项目本身 但是项目的属性又如何呢 下面的代码展示了如何执行此操作 当您运行宏时 调试窗口将显示存储对象的
  • 如何VBA等待Windows保存对话框和发送密钥

    我正在创建一个宏文件 用于下载并保存从 SAP 旧版本 7 20 中提取的数据 当出现保存对话框时 未检测到 Windows 对话框 因为我的客户端 SAP 版本是旧版本 7 20 现在我对此的解决方案是发送密钥 但问题是某些数据包含大量数
  • 枚举类型的 JAXB 元素

    所以我知道如何创建枚举类型 但是当我为其设置元素类型时 元素字段将只是字符串类型 而不是枚举类型 如何在我的模式中创建枚举并让 JAXB 将其生成为 java 枚举类型 这就是我创建枚举类型和元素的方式
  • 在 C# 中转换为反射类型

    考虑以下代码 object objFoo MakeFoo object MakeFoo return new Foo MethodInfo methodInfo typeof Program GetMethod Baz Foo Baz re
  • 正在使用的 VBA 监视文件

    我正在寻找一些东西 Win API 调用或其他 来在文件可供编辑 即不再使用 时通知我 我应该设置一个计时器来按一定时间间隔检查文件还是有一个好方法对文件设置监视 FileSystemWatcher 没有帮助 Win32 FindFirst
  • 在Excel中显示毫秒

    我正在尝试在 Excel 宏中显示毫秒 我有一列整数 它们是以毫秒为单位的时间戳 例如 28095200 是上午 7 48 15 200 我想在它旁边创建一个新列 以保持运行平均值并以hh mm ss 000格式 Dim Cel As Ra
  • 通过 Excel VBA 保存并关闭 powerpoint

    下面的代码根据定义的名称创建多个图表 然后打开具有这些定义的名称的 powerpoint 文件并转储到图表中 除了最后一部分之外 一切都正常 保存并关闭文件 我已将尝试保存和关闭文件的尝试标记为绿色 任何帮助表示赞赏 Sub Slide19
  • VB FFT - 难以理解结果与频率的关系

    试图理解我正在使用的 fft 快速傅里叶变换 例程 窃取 回收 输入是 512 个数据点的数组 它们是样本波形 测试数据生成到该数组中 fft 将该数组变换到频域 尝试理解频率 周期 采样率和 fft 数组中位置之间的关系 我用例子来说明
  • 将 CSV 导入 Excel - 自动“文本到列”和“插入表格”

    我想在 Excel 2010 上打开 CSV 逗号分隔 文件并自动将文本转换为列 然后选择所有活动单元格并插入带标题的表格 是否可以在我的功能区中添加一个按钮来为我完成这一切 我经常使用不同大小的 CSV 文件 我发现每次手动执行此操作有点
  • 在适用于 Windows 和 Mac 的 VBA 中指定用户文件夹的路径

    我正在编写一个使用 VBA 从 Excel 生成文件的工具 生成的文件将写入用户的 Documents 文件夹中的文件夹 如果存在 e g C Users
  • 我们可以在 android studio 中拥有没有 app 文件夹的项目,并将所有内容(java/res/etc)放在根目录中吗

    我想知道在 Android studio 中是否可以有没有应用程序模块 应用程序或任何其他名称 的 android 项目 意味着我可以在项目本身的根目录中创建包和资源 而不是使用应用程序模块 编辑 结构看起来像 MyApp idea gra
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐