VB6实现和事件

15

我有一个旧的VB6项目,我正试图为其添加单元测试。我通过模拟对象来打破类中的依赖关系。一切都很顺利,直到我发现一些依赖项正在触发事件,现在我陷入了困境。

这是我尝试但不起作用的快速示例:

ITab.cls:

Option Explicit

Public Event Click(tabNumber As Integer)

Public Sub SomeOtherFunction()

End Sub

clsRealTab.cls:

Option Explicit
Implements ITab

Public Event Click(tabNumber As Integer)

Public Sub ITab_SomeOtherFunction()
    'code here'
End Sub

frmMain.frm:

:frmMain.frm是一个窗体对象的名称,通常在Visual Basic中使用。
Option Explicit

Private WithEvents mTab as ITab

Public Sub Main()
    Set mTab = New clsRealTab 'gives "Object or class does not support the set of events" error'
End Sub

有人知道如何让这个工作或者其他处理这种情况的方法吗?

我实现了一个回调接口,我称之为ITabEventsHandler。它看起来像这样:

Option Explicit

Public Sub Click(intPreviousTab As Integer, objSSTab As Object)

End Sub

然后我在我的表单中添加了Implements ITabEventsHandler,并将表单作为ITabEventsHandler参数传递给了我的clsTab初始化程序。我可以直接调用mTabEventsHandler.Click(...)而不是触发自定义的Click(...)事件。

感谢您的建议!

1个回答

10

在VB6中,你无法完全“实现”源接口。因此简短的答案是“不行”。你可以通过直接编辑类型库来进行黑客攻击,但这很快会变得混乱不堪。

如果你必须通过不同(模拟)类“实现”这些接口,那么你可以考虑使用回调接口。


我考虑过创建一个回调接口,看起来这个方案可行。 - Adam Prescott
同意。在VB6中处理这个问题最优雅的方式是使用回调接口而不是原始事件。正如wqw所说,类型库黑客很快就会变得令人讨厌。 - Mike Spross
1
VB6手册中提到,Implements不支持事件,参考链接:http://msdn.microsoft.com/en-us/library/aa262327(VS.60).aspx - MarkJ
注意:使用接口来替代事件很可能会导致循环引用。 - rpetrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接