接口问题

我尝试在Excel VBA中实现一个实现两个接口的新类,但是由于接口的成员似乎没有在实现类中正确实现(它们不可调用),所以我遇到了编译问题。

接口如下:

ICrawlable

 Option Explicit Public Function GetCrawler() As ICrawler End Function 

IEquatable

 Option Explicit Public Function Equals(CompareObject As Variant) As Boolean End Function 

ICrawlable也包含一个返回接口ICrawler的函数:

 Option Explicit Public Property Get CurrentItem() As Variant End Property Public Sub MoveNext() End Sub Public Function GetNext() As Variant End Function Public Function ItemsLeft() As Boolean End Function 

我使用这两个第一个接口创build了一个示例类InterfaceTester

 Option Explicit Implements ICrawlable Implements IEquatable Private Function ICrawlable_GetCrawler() As Variant End Function Private Function IEquatable_Equals(CompareObject As Variant) As Boolean End Function 

当试图在模块中使用该类时,或者其他任何地方我都没有Intellisense支持。 此外代码不会编译,我得到一个“方法或Datamemeber找不到”在这个模块代码突出.Equals

 Sub TestInterfacing() Dim TestInstance As InterfaceTester Set TestInstance = New InterfaceTester Dim VerificationInstance As InterfaceTester Set VerificationInstance = New InterfaceTester Dim Result As Boolean Result = TestInstance.Equals(VerificationInstance) End Sub 

这是VBA中的错误吗? 我是否在不允许的接口中声明了一些东西(我已经尝试将所有返回数据types更改为Variant,并尝试禁用接口的每个函数)? 我使用保留关键字(在对象浏览器中,我没有看到我的接口名称重复)? 它是否在你的机器上编译?

如果要使用接口中的方法,则必须将variables声明为此接口types:

 Sub TestInterfacing() Dim TestInstance As IEquatable 'InterfaceTester Set TestInstance = New InterfaceTester Dim VerificationInstance As InterfaceTester Set VerificationInstance = New InterfaceTester Dim Result As Boolean Result = TestInstance.Equals(VerificationInstance) End Sub 

但是,在这种情况下,您不能使用此类实现的第二个接口中的方法: ICrawlable


原因是在VBA实现方法看起来像这样:

 Private Function ICrawlable_GetCrawler() As ICrawler 

在使用其他语言的规则时,它应该如下所示:

 Public Function GetCrawler() As ICrawler 

VBA不会理解,这是接口方法GetCrawler


为了解决这个问题,你应该添加另外两个公共方法到InterfaceTester类 – EqualsGetCrawler 。 实现方法只能指向那些方法:

InterfaceTester类:

 Implements ICrawlable Implements IEquatable Public Function Equals(CompareObject As Variant) As Boolean 'implementation End Function Public Function GetCrawler() As ICrawler 'implementation End Function Private Function ICrawlable_GetCrawler() As ICrawler Set IEquatable_Equals = GetCrawler End Function Private Function IEquatable_Equals(CompareObject As Variant) As Boolean IEquatable_Equals = Equals(CompareObject) End Function 

现在你可以声明你的variablesTestInstanceInterfaceTester类,并使用两个接口的方法。