我想知道,是否可以在VBA中创建类方法。我所说的class-method指的是可以在没有类对象的情况下调用的方法。‘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'
发布于 2008-12-28 12:36:48
这(“公共共享”)只能在VB.Net中工作。
无法在VBA (或VB)中定义类方法。我建议在模块中创建一个公共函数。
发布于 2010-11-17 01:19:01
静态1.创建一个包含需要设置为“”的公共方法的普通类
2.在这个“静态”类中包含一个公共方法,用于初始化类中的私有“静态字段”(如果您愿意,它可以接受参数)。
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').MethodName('parameters')来使用‘’类,不需要像工厂方法那样初始化实例
5. (可选)如果您想强制执行单例实例,您可以创建一个充当单例容器的模块-包括一个私有实例变量和一个公共访问器属性。你也可以选择使用一个'let‘setter来允许单例被一个新的静态类’替换‘(使用不同的构造函数参数--参见#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)
发布于 2014-07-04 20:45:45
您可以尝试将希望静态的类的VB_PredeclaredId
属性设置为True
。这将创建类的默认实例,其工作方式与窗体在VBA中的工作方式非常相似(请注意,您可以直接引用它们,而无需创建实例。我知道这不是最佳实践,但它是可能的)。
这意味着您将拥有更多单例样式的类,但它可以满足您的需求……
您不能直接从VBA IDE本身进行设置,但是可以执行以下步骤:
1.将您希望设置为静态的类导出到文件夹中。
2.在您喜欢的文本编辑器中打开导出的.cls
文件,并更改VB_PredeclaredId
的条目,使其显示为VB_PredeclaredId = True
。
VBA 3.保存文件并重新导入到中。
然后,您应该能够在类上调用您的公共方法,而不必实例化该类。请记住,只有在第一次执行类方法/访问类属性时才会调用Initialize
方法,而永远不会调用Terminate
方法。因此,您可能希望编写自己的构造函数,并确保在需要时显式调用析构函数。
参考:UtterAccess.com Singleton Example
参考:http://msdn.microsoft.com/en-us/library/ee199159.aspx
https://stackoverflow.com/questions/396117
复制相似问题