CallByName
функция может помочь вам. Допустим, в вашем проекте есть несколько модулей классов: clsSample0
, clsSample1
и clsSample2
. Добавьте новый модуль классов с именем clsSpawner
, в котором перечислены все целевые классы как открытые переменные, имена которых совпадают с e г. instance_
префикс и объявлен с ключевым словом New
:
Public instance_clsSample0 As New clsSample0
Public instance_clsSample1 As New clsSample1
Public instance_clsSample2 As New clsSample2
В модуль добавить Function Spawn()
код:
Function Spawn(sClassName) As Object
Set Spawn = CallByName(New clsSpawner, "instance_" & sClassName, VbGet)
End Function
Протестируйте его с помощью следующего кода:
Sub TestSpawn()
Dim objSample0a As Object
Dim objSample0b As Object
Dim objSample1 As Object
Dim objSample2 As Object
Set objSample0a = Spawn("clsSample0")
Set objSample0b = Spawn("clsSample0")
Set objSample1 = Spawn("clsSample1")
Set objSample2 = Spawn("clsSample2")
Debug.Print TypeName(objSample0a) ' clsSample0
Debug.Print TypeName(objSample0b) ' clsSample0
Debug.Print objSample0a Is objSample0b ' False
Debug.Print TypeName(objSample1) ' clsSample1
Debug.Print TypeName(objSample2) ' clsSample2
End Sub
Как это работает? Spawn
функция создает экземпляр clsSpawner
и вызывает экземпляр clsSpawner
для возврата запрошенного свойства, а фактически экземпляр clsSpawner
создает новый экземпляр целевого класса из-за объявления с ключевым словом New
и возвращает ссылку.