我想知道,是否可以在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.创建一个包含需要"静态"的公共方法的普通类
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)
那个("公共共享")只适用于VB.Net.
无法在VBA(或VB)中定义类方法.我建议在模块中创建一个公共函数.
您可以尝试设置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
在一天的晚些时候,但是到底是什么
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分配参数,然后返回实例.如果你在很多地方构建对象的实例,那么这可以节省很多代码.