VB6 类没有参数化构造函数。您为此选择了什么解决方案?使用工厂方法似乎是显而易见的选择,但令我惊讶!
我通常坚持使用工厂方法,将相关类的“构造函数”放在同一模块(.BAS 扩展名)中。遗憾的是,这远非最佳,因为您无法真正限制对 VB6 中正常对象创建的访问 - 您只需注意仅通过工厂创建对象。
更糟糕的是必须在实际对象和工厂方法之间跳转,因为 IDE 本身的组织充其量也很麻烦。
使用可用的类初始值设定项怎么样?这就像一个无参数构造函数:
Private Sub Class_Initialize()
' do initialization here
End Sub
我混合使用工厂函数(在父类中),然后创建对象的实例并调用 Friend
Init()
方法。
班级
CObjects
:
Public Function Add(ByVal Param1 As String, ByVal Param2 As Long) As CObject
Dim Obj As CObject
Set Obj = New CObject
Obj.Init Param1, Param2
Set Add = Obj
End Function
班级
CObject
:
Friend Sub Init(ByVal Param1 As String, ByVal Param2 As Long)
If Param1 = "" Then Err.Raise 123, , "Param1 not set"
If Param2 < 0 Or Param2 > 15 Then Err.Raise 124, , "Param2 out of range"
'Init object state here
End Sub
我知道
Friend
范围不会对项目产生任何影响,但它作为一个警告,表明这仅供内部使用。
如果这些对象通过 COM 公开,则无法调用 Init
方法,并且将类设置为 PublicNotCreatable
会停止创建它。
这个解决方案离完美还很远,但是,这就是我最终为我的一些遗留项目所做的事情。对于存储来说,它在某种程度上节省了内存,但是仅仅查找某些内容肯定会比其他方式花费更多的时间,特别是对于巨大的结构。 假设您需要实现以下内容,
type user
id as long
name as String
desc as String
end type
但请注意,VB6 本身支持字符串。因此,不要使用结构,而是使用“假结构”函数,例如
Public Function user_raw(ByVal id as Long, ByRef name as String, ByRef desc as String) as String
Const RAW_DELIM as String = "|"
user_raw = cstr(id) & RAW_DELIM & name & RAW_DELIM & desc
End Function
因此,您将拥有可按值传递(因此可堆叠到数组或多行字符串中),由字符串组成的“假结构”,例如
1|Foo|VB的老大
2|酒吧|Foo的徒弟
因此该构造也算作执行
to_string()
的粗略方法。好的一面是,这样的存储几乎可以立即转换为 Markdown 表语法。
稍后,您可以通过执行类似的操作从结构中检索数据,
Public const RAW_DELIM as String = "|"
Public Const POS_USER_ID = 0
Public Const POS_USER_NAME = 1
Public Const POS_USER_DESC = 2
'...
public function get_raw_variable(byref user as String, byval var as integer) as String
dim buf() as String
buf = SPLIT(user, "|")
Assert ubound(buf) <= var
get_raw_variable = buf(var)
end function
检索确实效率低下,但已经是你能拥有的最好的了。祝你好运
首先创建一个标准的
Class,并将 Instancing 设置为 False。 假设它的名称是Class1。保存班级。 在任何文本编辑器中打开它,您应该看到属性 VB_Creatable 设置为 False。在编辑器中将 VB_PredeclaredId 设置为 True。该属性可以在 VBA IDE 中控制,但不能在 VB6 中控制。 类属性部分将如下所示
Attribute VB_Name = "Class1"
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
该类不可创建,因此您不能使用 New 来创建它。
现在添加一个构造函数和初始化方法,如下所示
Public Function Create(myConstructParams As String, ... other params) As Class1
' create the class
Set Create = New Class1
' then initialize it with any params you get from the Constructor
Create.Init(....)
End Function
Friend Sub Init(......)
' initialization code
End Sub
现在为了创建 Class1 对象,您必须使用以下语法:
Dim obj As Class1
Set obj = Class1.Create("Initalize my object")
由于 New() 不能在 Class1 上使用,我们实际上创建了一种 VB6 类的Constructor
。