Передача массива, типизированного классом, реализующим интерфейс, когда функция / процедура ожидает массив, типизированный интерфейсом? - PullRequest
0 голосов
/ 27 ноября 2018

Допустим, у меня есть интерфейс ITest1 , определенный:

Option Explicit

Sub it1Test(cTest As ITest1)
End Sub

А затем я создал класс CTest1 , который его реализует:

Option Explicit

Implements ITest1

Private Sub ITest1_it1Test(cTest As ITest1)
End Sub

Private Sub Test1()
    Dim cT1 As CTest1
    cT1 = New CTest1
    ITest1_it1Test cT1
End Sub

Если я пытаюсь скомпилировать этот код, все работает отлично, что в общем-то и является тем, что я ожидаю.

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

Итак, мой новый интерфейс ITest2 выглядит следующим образом

Option Explicit

Sub it2Test(cTest() As ITest2)
End Sub

И класс CTest2 , реализующий его:

Option Explicit

Implements ITest1

Private Sub ITest1_it1Test(cTest() As ITest1)
End Sub

Private Sub Test2()
    Dim cT2(1 To 1) As CTest2
    cT2(1) = New CTest2
    ITest2_it2Test cT2
End Sub

В этот раз я не могу скомпилировать с ошибкой:

Ошибка компиляции:

Несоответствие типов аргументов ByRef

с выделенным параметром cT2функции ITest2_it2Test в качестве источника ошибки.

Можно ли передать массив класса, реализующий интерфейс, если функция ожидает массив типа этого интерфейса.Другими словами, имеет ли смысл использовать интерфейс как тип параметра массива?

Я знаю, что можно использовать Variant в качестве типа массива, но это подрывает множество преимуществ, которые я получаю благодаряиспользование интерфейса.

Я не могу найти ничего, связанного с таким конкретным случаем.Я проверил количество страниц о способах реализации интерфейсов в целом (от документов MS до страницы CPearson).Я также не могу найти что-нибудь здесь, на переполнение стека.Я проверил все 78 вопросов с тегами vba и excel с интерфейсом и массивом ключевых слов и некоторыми из предложенных вопросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...