Vba 创建作为参数传递的类的副本

Vba 创建作为参数传递的类的副本,vba,excel,class,Vba,Excel,Class,我正在VBA中创建一个项目来自动处理异步准多线程(非常抱歉)。这围绕着创建和运行一个类的多个副本而展开,该类实现了某个接口,并在异步任务完成时引发一些已知事件。接口类似于 我的程序调用该类来执行其代码,并侦听所引发的事件,一切正常。现在,我的最后一个任务是获取任何实现了相应接口的给定类,并制作多个副本以使set并行运行 如何复制传递给例程的类 我如何获取一个类引用并制作多个新版本 或者在代码中,我的每个线程类(处理传递的异步类的类)都有一个Worker属性来保存它们的任务 Private wor

我正在VBA中创建一个项目来自动处理异步准多线程(非常抱歉)。这围绕着创建和运行一个类的多个副本而展开,该类
实现了某个接口,并在异步任务完成时引发一些已知事件。接口类似于

我的程序调用该类来执行其代码,并侦听所引发的事件,一切正常。现在,我的最后一个任务是获取任何
实现了相应接口的给定类,并制作多个副本以使set并行运行

如何复制传递给例程的类

我如何获取一个类引用并制作多个新版本

或者在代码中,我的每个线程类(处理传递的异步类的类)都有一个
Worker
属性来保存它们的任务

Private workerObject As IWorker
Public Property Set Worker(workObj As IWorker) 'pass unknown class with IWorker interface
    'What goes here?
    Set workerObject = workObj
    'This won't work as then every thread points to the same worker
    'I want something to create a New one, like
    Set workerObject = New ClassOf(workObj)
    'But of course that doesn't work
End Property

您需要检查可能的类型并采取相应的行动:

Dim workerObject As IWorker

If TypeOf workObj Is ImplementingClass1 Then
    Set workerObject = New ImplementingClass1

ElseIf TypeOf workObj Is ImplementingClass2 Then
    Set workerObject = New ImplementingClass2

End If
或者,您可以将factory方法添加到接口:

Public Function CreateNew() As IWorker: End Function
在类中实现它:

Public Function IWorker_CreateNew() As IWorker
    Set IWorker_CreateNew = New ImplementingClass1
End Function
然后:

Set workerObject = workObj.IWorker_CreateNew()

如果要克隆实例,则需要手动执行,即添加一个.clone()方法,该方法创建一个新实例,然后将其自身的内部状态分配给该实例,然后返回该实例。@AlexK。这并不理想,因为我必须确保我的
IWorker
接口规定了
.Clone()
函数,该函数在我将要传递的类中似乎是任意的和错误的。我也不一定想要克隆,如果可以的话,我想要一个新实例。您可以将函数(f.eks.
Create
)作为实现类的一部分(将其
Predeclared ID
设置为true),并让它创建一个新的干净实例。然后可以将
Dim W声明为IWorker
Set W=New IWorker
Set W=Worker.Create
(其中
Worker
是实现类)。看看更好的解释。我想知道我是否可以通过
byVal
,它似乎不起作用,但这可能是一个实现错误-有人知道这在理论上是否应该起作用吗?或者为什么不应该?