Ошибка несоответствия типов при передаче дочернего типа подпрограмме, принимающей родительский тип VBA - PullRequest
0 голосов
/ 13 ноября 2018

Context

У меня есть родительский интерфейс, IParent,

Option Explicit

Public Sub DoParentStuff()
End Sub

дочерний интерфейс, реализующий IParent, IChild,

Option Explicit

Implements IParent

Private Sub IParent_DoParentStuff()
End Sub

Public Sub DoParentStuff()
End Sub

и конкретную реализацию IChild, CStandardChild.

Option Explicit

Implements IChild

Private Sub IChild_DoParentStuff()
End Sub

Public Sub DoParentStuff()
  IChild_DoParentStuff
End Sub

Затем я создал модуль, который передает переменную типа IChild в подпрограмму с одним параметром типа IParent.

Option Explicit

Private Sub Test(ByRef parent As IParent)
  parent.DoParentStuff
End Sub

Public Sub Main()
  Dim child As IChild

  Set child = New CStandardChild

  Test child
End Sub

Я могу скомпилировать проект VBA без ошибок.Но когда я запускаю Main, я получаю ошибку времени выполнения

Ошибка времени выполнения '13':

Несоответствие типов

Отладчик указывает на код Test child.

Вопрос

Почему я получаю ошибку несоответствия типов во время выполнения?Как я могу передать child в Test() без получения этой ошибки?

Что я пробовал

Я смотрел на приведение IChild к IParent.Однако я не использую VB.NET, поэтому у меня нет доступа к DirectCast и CType.Говоря так, если я правильно реализовал IParent и IChild, я не думал, что приведение необходимо.

1 Ответ

0 голосов
/ 13 ноября 2018

Если я правильно понимаю, что вы пытаетесь сделать, похоже, вы пытаетесь расширить IParent с помощью IChild участников. Вы не можете сделать это в VBA - это было бы здорово, но это часть того, что делает .NET более гибкой средой для работы.

Чтобы провести аналогию с C #, я думаю, вы пытаетесь это сделать (и это недопустимо в VBA):

interface IFoo { void DoSomething() }
interface IBar : IFoo { void DoStuff() } // inherits members of IFoo

Если вам нужно, чтобы CStandardChild был доступен через интерфейсы IParent и IChild, вам понадобятся оба оператора Implements в этом классе:

Option Explicit
Implements IChild
Implements IParent

'implement members of both interfaces...

Затем вы можете передать экземпляр этого класса и «привести» его к любому интерфейсу.

...