将子类型传递给接受父类型VBA的子例程时,类型不匹配错误

时间:2018-11-12 22:32:29

标签: excel vba interface runtime-error

上下文

我有一个父接口IParent

Option Explicit

Public Sub DoParentStuff()
End Sub

实现IParentIChild

的子接口
Option Explicit

Implements IParent

Private Sub IParent_DoParentStuff()
End Sub

Public Sub DoParentStuff()
End Sub

以及IChildCStandardChild的具体实现。

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,因此,我无权访问DirectCastCType。这样说来,如果我适当地实现了IParentIChild,我认为就没有必要进行强制转换。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您要执行的操作,则好像您正在尝试将IParent成员扩展为IChild。您无法在VBA中做到这一点-太棒了,但这是使.NET成为更灵活的工作框架的一部分。

举个C#的比喻-这是我想您要尝试做的(在VBA中是非​​法的):

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

如果您需要同时通过CStandardChildIParent接口访问IChild,则需要该类中的Implements条语句:

Option Explicit
Implements IChild
Implements IParent

'implement members of both interfaces...

然后,您可以传递该类的实例并将其“投射”到任一接口。