VB6类没有参数化构造函数。你为此选择了什么解决方案?使用工厂方法似乎是明显的选择,但让我感到惊讶!
答案 0 :(得分:7)
我通常坚持使用工厂方法,我将相关类的“构造函数”放在同一个模块中(.BAS扩展名)。遗憾的是,这远非最优,因为您无法真正限制对VB6中正常对象创建的访问 - 您只需要指出只通过工厂创建对象。
更糟糕的是必须在实际对象和工厂方法之间跳转,因为IDE本身的组织充其量是繁琐的。
答案 1 :(得分:6)
如何使用可用的类初始值设定项?这类似于无参数构造函数:
Private Sub Class_Initialize()
' do initialization here
End Sub
答案 2 :(得分:6)
我使用混合的工厂函数(在父类中),然后创建对象的实例并调用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
stops it being created。
答案 3 :(得分:0)
此解决方案与理想情况相比还很差,但我最终还是为一些遗留项目所做的。对于存储而言,这在某种程度上是节省内存的,但是仅查找内容肯定比其他所需的时间更长,尤其是对于大型结构。
假设您需要实现以下内容,
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 | Bar | 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
检索肯定效率低下,但是大约是您所能获得的最好的结果。祝你好运