您如何处理 VB6 中缺少构造函数的问题?

问题描述 投票:0回答:5

VB6 类没有参数化构造函数。您为此选择了什么解决方案?使用工厂方法似乎是显而易见的选择,但令我惊讶!

class vb6 constructor
5个回答
6
投票

我通常坚持使用工厂方法,将相关类的“构造函数”放在同一模块(.BAS 扩展名)中。遗憾的是,这远非最佳,因为您无法真正限制对 VB6 中正常对象创建的访问 - 您只需注意仅通过工厂创建对象。

更糟糕的是必须在实际对象和工厂方法之间跳转,因为 IDE 本身的组织充其量也很麻烦。


6
投票

使用可用的类初始值设定项怎么样?这就像一个无参数构造函数:

Private Sub Class_Initialize()
    ' do initialization here

End Sub

5
投票

我混合使用工厂函数(在父类中),然后创建对象的实例并调用 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
会停止创建它


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|酒吧|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

检索确实效率低下,但已经是你能拥有的最好的了。祝你好运


0
投票

首先创建一个标准的

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

© www.soinside.com 2019 - 2024. All rights reserved.