大多数属性都需要一个支持字段。通常它看起来像这样:
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# 中的相同。