我有一个父接口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
,我认为就没有必要进行强制转换。
答案 0 :(得分:1)
如果我正确理解您要执行的操作,则好像您正在尝试将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...
然后,您可以传递该类的实例并将其“投射”到任一接口。