Ben*_*ack 7 c# oop excel ms-access vba
在C#中,我知道我可以通过在类的主体中指定它来重载类的构造函数:
public class MyClass()
{
public MyClass(String s) { ... }
}
Run Code Online (Sandbox Code Playgroud)
这将覆盖默认构造函数(没有参数)并强制使用参数s初始化类.
我知道在VBA中我可以初始化我的类Private Sub Class_Initialize(),但我不知道是否有办法强制我的类用参数初始化.可以这样做吗?
正如Jtolle指出的那样,这在VBA/VB6中是不可能的.没有完美的解决方法,但我个人所做的是使用我想要的参数创建一个Public/Friend子调用Initialize(在VBA/VB6中使用"可选"参数进行重载)然后快速检查如果您尝试在不运行initialize方法的情况下尝试访问它们,则抛出异常的类的所有公开成员.一个基本示例可能如下所示:
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
Run Code Online (Sandbox Code Playgroud)
它并不好,但它与VBA/VB6一样好.
你已经有两个正确的答案; 你不能在VBA中有一个带参数的构造函数.
Oorang的解决方法基本上是正确的 - 有一个单独的"init"方法.当我在Excel/VBA中采用面向对象的方法时,我更喜欢在常规函数中隐藏对象创建和init.所以我有mkFoo(parm)并调用它来获取Foo实例.mkFoo()将创建一个New Foo实例并调用Foo.init().如果您只是以这种方式创建实例,则无需检查您的实例是否已反复初始化.
如果您真的想要正确并且不提供暴露可能现在危险的init()方法的对象,那么您可以拥有由Foo实现的IFoo接口(没有init方法).然后mkFoo()返回一个IFoo,实际Foo的任何用户都根本看不到init()方法.
当然,现在你有一堆模块只用于Foo - 一个用于IFoo,一个用于每个实际的Foo类,一个用于你的"Foo工厂"功能......因此我的评论是这是为什么OOP in的众多原因之一VBA是一个PITA,即使它有时很有用.
编辑:这是onedaywhen在原始答案后不久编辑的一个编辑,但我刚刚将其单独删除,因为它实际上是一个单独的想法:
说到Excel,您可以将Foo类重定位到.xla加载项中,并使类PublicNotCreateable.公共函数mkFoo(parm)可以驻留在加载项中的标准.bas模块中,因此在C#中有点像静态类.这会强制客户端代码使用mkFoo作为创建Foo实例的唯一方法.毫无疑问,有一个MS Access类似于Excel的.xla加载项.
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |