首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBA中的类(静态)方法

VBA中的类(静态)方法
EN

Stack Overflow用户
提问于 2008-12-28 12:03:39
回答 8查看 70.5K关注 0票数 48

我想知道,是否可以在VBA中创建类方法。我所说的class-method指的是可以在没有类对象的情况下调用的方法。‘static’-关键字在C++和Java中做到了这一点。

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

示例:

代码语言:javascript
运行
复制
'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'
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-12-28 12:36:48

这(“公共共享”)只能在VB.Net中工作。

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

票数 29
EN

Stack Overflow用户

发布于 2010-11-17 01:19:01

静态1.创建一个包含需要设置为“”的公共方法的普通类

2.在这个“静态”类中包含一个公共方法,用于初始化类中的私有“静态字段”(如果您愿意,它可以接受参数)。

3.创建模块作为工厂

代码语言:javascript
运行
复制
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语言的情况下分配单例

代码语言:javascript
运行
复制
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.分配单例的:

代码语言:javascript
运行
复制
CurrentStaticClass = CreateStaticClass(parameters)

7.使用单例的:

代码语言:javascript
运行
复制
[value = ] CurrentStaticClass.MethodName(parameters)
票数 46
EN

Stack Overflow用户

发布于 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

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/396117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档