你是如何处理VB6中缺少构造函数的?

时间:2010-08-01 17:08:26

标签: class vb6 constructor

VB6类没有参数化构造函数。你为此选择了什么解决方案?使用工厂方法似乎是明显的选择,但让我感到惊讶!

4 个答案:

答案 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

检索肯定效率低下,但是大约是您所能获得的最好的结果。祝你好运