有没有办法来重载VBA中的类的构造函数/初始化过程?

在C#中,我知道我可以通过在类的主体中指定它来重载类的构造函数:

public class MyClass() { public MyClass(String s) { ... } } 

这覆盖默认的构造函数(没有参数),强制类用参数s初始化。

我知道在VBA中,我可以用Private Sub Class_Initialize()来初始化我的类,但我不知道是否有办法强制我的类用参数初始化。 可以这样做吗?

正如Jtolle所指出的,这在VBA / VB6中是不可能的。 有没有完美的方法来解决这个问题,但我个人做的是创build一个Public / Friend子调用初始化与我想要的参数(在VBA / VB6中使用“可选”参数重载),然后把一个快速检查如果您尝试在不运行initialize方法的情况下访问它们,则会引发exception的所有类的公开成员。 一个基本的例子可能是这样的:

 Option Explicit Private m_blnInitialized As Boolean Private m_lngID As Long Private m_strFirstName As String Public Sub Initialize(ByVal ID As Long, Optional ByVal someOtherThing As String = vbNullString) If m_blnInitialized Then Me.Clear m_lngID = ID m_strFirstName = SomeLookUp() If LenB(someOtherThing) Then ''Do something here. End If m_blnInitialized = True End Sub Public Property Get ID() As Long If Not m_blnInitialized Then Err.Raise eStandardErrors.eNotInitialized ID = m_lngID End Property Public Property Get FirstName() As String If Not m_blnInitialized Then Err.Raise eStandardErrors.eNotInitialized FirstName = m_strFirstName End Property Private Function SomeLookUp() As String ''perform magic on Me.ID End Function Public Sub LoadPicture() If Not m_blnInitialized Then Err.Raise eStandardErrors.eNotInitialized ''More magic End Sub Public Sub Clear() If Not m_blnInitialized Then Err.Raise eStandardErrors.eNotInitialized m_strFirstName = vbNullString m_lngID = 0& m_blnInitialized = False End Sub 

这不是很好,但是和VBA / VB6一样好。

你已经有了两个正确的答案。 你不能从字面上有VBA中的参数的构造函数。

Oorang的解决方法基本上是正确的 – 有一个单独的“init”方法。 当我在Excel / VBA中采用面向对象的方法时,我更喜欢在普通函数中隐藏对象创build和init。 所以我会有mkFoo(parm)并且调用它来获得一个Foo实例。 mkFoo()将创build一个New Foo实例并调用Foo.init()。 如果你只是以这种方式创build实例,那么不需要检查你的实例是否被一遍又一遍的初始化。

如果你真的想要正确的,并且不提供一个暴露了一个maybe-now-dangerous init()方法的对象,你可以有一个由Foo实现的IFoo接口(没有init方法)。 然后mkFoo()返回一个IFoo,而实际的Foo的任何用户都根本不会看到init()方法。

当然,现在你有一堆为Foo的模块 – 一个为IFoo,一个为每个实际的Foo类,一个为你的“Foo工厂”函数…因此我的评论认为,这是OOP的原因之一VBA是PITA,即使它有时是有用的。

编辑:这是一个由原来的答案不久后编辑onedaywhen,但我现在分开,因为它是一个单独的思想:

说到Excel,您可以将Foo类重定位到.xla加载项,并使类为PublicNotCreateable。 公共函数mkFoo(parm)可以驻留在加载项中的标准.bas模块中,因此在C#中被称为静态类。 这强制客户端代码使用mkFoo作为创buildFoo实例的唯一方法。 毫无疑问,Excel的.xla插件有一个MS Access类比。

不,类不能用VBA中的参数初始化。 这是不合法的,因为Dim ... As New ... statement在第一次访问时隐式地构造对象。

 Dim x As New MyClass x.Prop = 42 ' Before x.Prop is set, x is implicitly constructed 

类构造函数方法并重载类构造函数在Visual Basic 6.0中,名为Class_Initialize的类Initialize事件处理函数用于执行在创build对象时需要执行的代码。

在Visual Basic 2005中,将一个或多个构造函数添加到类中以执行代码并初始化variables。 构造函数是类New中的方法。 New方法可以被重载以在同一个类语句中提供多个构造函数名称New。

有关更多信息,请参阅新build(Visual Basic)或使用构造函数和析构函数 。 http://msdn.microsoft.com/en-us/library/55yzhfb2(v=vs.80).aspx