gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:46:15 25 4
gpt4 key购买 nike

我想遵循 this excellent answer 中描述的 MVP 用户窗体架构由马修·金东 (Mathieu Guindon) 着。但是,我不明白为什么在 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 私有(private)支持字段和公共(public) Foo 属性 - 当类中的成员过多时,它很快就会变得嘈杂。

此外,我真的不喜欢这种 m 前缀方案,但由于 VBA 不区分大小写,因此您不能为 提供 foo 支持字段>Foo 属性。

通过声明一个私有(private)类型来保存封装的实例状态...

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 的所有成员的自动完成列表,本地工具窗口现在是将实例状态值分组到类中唯一的私有(private)字段 this 下,这使得调试工具更加简洁。

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


Why not just declare SelectedFilter as a property of type string?

如果这意味着“为什么不声明一个字符串类型的公共(public)字段”,那么这是一个不同的问题,有不同的答案。

每个类都定义了一个默认接口(interface),其成员是该类的Public 成员。但是接口(interface)不公开字段,所以如果你有一个类的公共(public)字段,它的默认接口(interface)将有 Property GetProperty Let/Set 访问器:定义明确的 Property 成员而不仅仅是公共(public)字段,您正在使类定义与其默认接口(interface)一致。 ..并且您正在封装 内部状态 - 封装 是 OOP 的 4 大支柱之一:与公开无关的事情不应该公开。使用属性,您可以控制如何分配支持私有(private)字段:类之外的任何人都无法访问它。例如,如果外部代码试图将 Foo 分配给空字符串,或者分配给与某些正则表达式模式不匹配的字符串,您可能需要运行一些验证逻辑并引发错误。

虽然使用属性与公共(public)字段的优势超出了这个问题的范围(并且已经在其他地方回答过),但该主题在很大程度上与语言无关,所以不必将您的研究局限于 VBA:原因使用(或不使用)属性与公共(public)字段在 VBA 中与在 Java 或 C# 中相同。

关于vba - 为什么要在 VBA 类模块中声明新类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com