Создайте новый объект с помощью текстового названия класса

Существует ли способ установить объект на новый экземпляр класса при помощи текстового названия класса?

У меня будет библиотека классов, и в зависимости от некоторой другой переменной, я хочу получить один из этих классов во времени выполнения.

Например, у Меня есть "CTest1", "CTest2", "CTest3"

У меня была бы функция подобной ниже

Function GetTestClass(lngClassNo as long) as Object
  Dim strClassName as String    
  strClassName = "CTest" & CStr(lngClassNo)
  Set GetTestClass = New instance of class(strClassName)
End Function
7
задан TylerH 9 July 2019 в 20:45
поделиться

3 ответа

В VBA нет отражения, поэтому я не думаю, что это возможно. Боюсь, вам придется сделать что-то вроде следующего:

Function GetTestClass(lngClassNo as long) as Object

    Select Case lngClassNo
    Case 1
        Set GetTestClass = New CTest1
    Case 2
        Set GetTestClass = New CTest2
    ...

    End Select

End Function

Если только это не ваши классы CTest, определенные в COM-DLL, вы можете использовать оператор CreateObject. Вам нужно будет использовать VB6 для создания такой DLL, хотя вы не можете создавать DLL в Excel, Access и т. Д.

Function GetTestClass(lngClassNo as long) as Object

    Set GetTestClass = CreateObject("MyDll.CTest" & lngClassNo)

End Function
4
ответ дан 7 December 2019 в 01:25
поделиться

Определения классов VB действительно негласно определяют COM-интерфейсы, поэтому можно определить типы данных как определение абстрактного интерфейса с конкретными реализациями, используя ключевое слово Implements .

Чтобы получить какой-либо полиморфизм, вы должны сделать это, иначе у вас будут проблемы с приведением типов. Это несколько неудобно, но технически возможно сделать с помощью VB. Если вы хотите вникнуть в это, найдите некоторые из продвинутых книг по VB Дэна Эпплмана или Мэтью Курланда. Я не уверен, что они все еще в печати, но они, вероятно, доступны через Amazon Marketplace.

Это работает с VB6, и я вполне уверен, что это работает с VBA.

2
ответ дан 7 December 2019 в 01:25
поделиться

Возможно, вы сможете сделать это с помощью класса коллекции или массива объектов. Все объекты в одном массиве.

В вашем классе есть свойство .Name, и когда вы создаете его экземпляр, сделайте следующее:

Dim CTest() as New CTest
For n = 1 to 10
    Redim Preserve CTest(n)
    CTest(n).Name = "CTest" & CStr(n)
Next l

Быстро и грязно. В приведенном выше примере будет возвращено 10 объектов CTest в одном массиве объектов. Вы также можете отказаться от .Name и просто использовать CTest (n).

0
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: