大多数属性都需要一个支持字段。通常它看起来像这样:
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 声明为字符串类型的属性?
如果这意味着“为什么不声明一个字符串类型的公共字段”,那么这是一个不同的问题,有不同的答案。
每个类都定义了一个默认接口,其成员是类的Public 成员。但是接口不公开字段,所以如果你在一个类上有一个公共字段,它的默认接口将有 Property Get 和 Property Let/Set 访问器:通过定义明确的 Property 成员而不是仅仅一个公共字段,你使类定义与其默认接口一致。 ..并且您正在封装内部状态 - 封装是 OOP 的 4 个支柱之一:没有业务公开的事物不应该公开。使用属性,您可以控制支持私有字段的分配方式:类外的任何人都无法访问它。例如,如果外部代码尝试将 Foo 分配给空字符串或与某些正则表达式模式不匹配的字符串,您可能需要运行一些验证逻辑并引发错误。
虽然使用属性与公共字段的优势超出了这个问题的范围(并且已经在其他地方得到了回答),但是这个主题与语言无关,所以不一定要将您的研究局限于 VBA:使用(或不使用)属性与公共字段在 VBA 中与在 Java 或 C# 中的相同。