当前位置:  开发笔记 > 后端 > 正文

VBA中的类(静态)方法

如何解决《VBA中的类(静态)方法》经验,为你挑选了4个好方法。

我想知道,是否可以在VBA中创建类方法.通过类方法,我的意思是可以在没有类的对象的情况下调用的方法.'static'关键字在C++和Java中实现了这一技巧.

在下面的示例中,我尝试创建一个静态工厂方法.

例:

'Classmodule Person'
Option Explicit
Private m_name As String
Public Property Let name(name As String)
    m_name = name
End Property
Public Function sayHello() As String
    Debug.Print "Hi, I am " & m_name & "!"
End Function

'---How to make the following method static?---'
Public Function Create(name As String) As Person
    Dim p As New Person
    p.m_name = name
    Set Create = p
End Function

'Using Person'
Dim p As New Person
p.name = "Bob"
p.sayHello 'Works as expected'
Set p2 = Person.Create("Bob") 'Yields an error'

小智.. 42

1.创建一个包含需要"静态"的公共方法的普通类

2.包含一个公共方法[在这个'静态'类中]初始化类中的[private]'静态字段'(如果你愿意,它可以带参数)

3.创建一个模块充当工厂

Public Function CreateStaticClass(parameters for 'constructor') As StaticClass

    Dim static As StaticClass
    Set static = New StaticClass
    Call StaticClass.Constructor(pass in parameters)
    Set CreateStaticClass = static

End Function

4.您现在可以通过调用CreateStaticClass('parameters')来使用'static'类.DesjectName('parameters')不需要初始化实例,因为这是由工厂方法完成的

5.(可选)如果要强制执行单例实例,可以创建充当单例容器的模块 - 包括私有实例变量和公共访问器属性.可选地,您可以使用'let'设置器来允许使用新的[static]类"替换"单例(使用不同的构造函数参数 - 请参阅#2,3).使用'Let'作为setter,因此您可以在不使用'set'ala OO语言的情况下指定单例

Private curStaticClass as StaticClass

Public Property Get CurrentStaticClass() As StaticClass 

    If curStaticClass Is Nothing Then Set curStaticClass = CreateStaticClass

    Set CurrentStaticClass = curStaticClass  

End Property

Public Property Let CurrentStaticClass(value As StaticClass)

    If Not (curStaticClass Is Nothing) Then Set curStaticClass = Nothing

    Set curStaticClass = value 

End Property

6.分配单身人士:

CurrentStaticClass = CreateStaticClass(parameters)

7.使用单身人士:

[value = ] CurrentStaticClass.MethodName(parameters)


小智.. 30

那个("公共共享")只适用于VB.Net.

无法在VBA(或VB)中定义类方法.我建议在模块中创建一个公共函数.



1> 小智..:

1.创建一个包含需要"静态"的公共方法的普通类

2.包含一个公共方法[在这个'静态'类中]初始化类中的[private]'静态字段'(如果你愿意,它可以带参数)

3.创建一个模块充当工厂

Public Function CreateStaticClass(parameters for 'constructor') As StaticClass

    Dim static As StaticClass
    Set static = New StaticClass
    Call StaticClass.Constructor(pass in parameters)
    Set CreateStaticClass = static

End Function

4.您现在可以通过调用CreateStaticClass('parameters')来使用'static'类.DesjectName('parameters')不需要初始化实例,因为这是由工厂方法完成的

5.(可选)如果要强制执行单例实例,可以创建充当单例容器的模块 - 包括私有实例变量和公共访问器属性.可选地,您可以使用'let'设置器来允许使用新的[static]类"替换"单例(使用不同的构造函数参数 - 请参阅#2,3).使用'Let'作为setter,因此您可以在不使用'set'ala OO语言的情况下指定单例

Private curStaticClass as StaticClass

Public Property Get CurrentStaticClass() As StaticClass 

    If curStaticClass Is Nothing Then Set curStaticClass = CreateStaticClass

    Set CurrentStaticClass = curStaticClass  

End Property

Public Property Let CurrentStaticClass(value As StaticClass)

    If Not (curStaticClass Is Nothing) Then Set curStaticClass = Nothing

    Set curStaticClass = value 

End Property

6.分配单身人士:

CurrentStaticClass = CreateStaticClass(parameters)

7.使用单身人士:

[value = ] CurrentStaticClass.MethodName(parameters)



2> 小智..:

那个("公共共享")只适用于VB.Net.

无法在VBA(或VB)中定义类方法.我建议在模块中创建一个公共函数.


[有一种方法,但它是作弊](http://stackoverflow.com/a/25015767/2140173);)

3> i_saw_drones..:

您可以尝试设置VB_PredeclaredId您希望为静态的类的属性True.这创建了类的默认实例,其方式与在VBA中表单工作的方式非常相似(请注意,您可以直接引用它们而无需创建实例.我知道这不是最佳实践,但它是可行的).

这意味着您将拥有更多的单例式类,但它可以满足您的要求......

您不能直接从VBA IDE本身设置它,但是,您可以执行以下步骤:

1.将要静态的类导出到文件夹.

2..cls在您喜欢的文本编辑器中打开导出的文件,然后更改条目以VB_PredeclaredId使其读取VB_PredeclaredId = True.

3.保存文件并重新导入VBA.

然后,您应该能够在类上调用公共方法,而无需实例化该类.请记住,该Initialize方法仅在您第一次执行类方法/访问类属性时Terminate调用,并且永远不会调用方法.因此,您可能希望编写自己的构造函数,并确保在需要时显式调用析构函数.

参考:UtterAccess.com Singleton示例

参考:http://msdn.microsoft.com/en-us/library/ee199159.aspx


优秀的解决方案,感谢您精确的VBA规范参考.这应该是最佳答案,我认为仅落后,因为它是在4年后(目前)最佳答案.我建议.
这是在VBA中实现"静态"类行为的正确方法

4> Swanny..:

在一天的晚些时候,但是到底是什么

VB6/VBA中没有类或静态方法.但您可以明确说明模块的名称.你不能拥有一个模块和一个同名的类,但你可以称它为类似的东西.

所以我可以有一个名为Employee的类和一个名为EmployeeUtil的模块然后我可以写:

  Dim emp As Employee
  Dim code As String
  Set emp = EmployeeUtil.Create( "Smith", "John", 21-Feb-1988)
  code = "123XY"
  If EmployeeUtil.IsCodeValid( code) Then
    emp.Code = code
  Else
    emp.Code = EmployeeUtil.DefaultCode
  EndIf

是的,值是硬编码的,代码处理应该在属性设置器下,但这不是我想要的.EmployeeUtil实际上是非实例成员的占位符.

你会注意到,这种方法的Create方法为Employee类提供了一个类似伪的构造函数.该函数所做的就是创建一个Employee实例,通过属性setter分配参数,然后返回实例.如果你在很多地方构建对象的实例,那么这可以节省很多代码.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有