接口问题
我尝试在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
类 – Equals
和GetCrawler
。 实现方法只能指向那些方法:
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
现在你可以声明你的variablesTestInstance
为InterfaceTester
类,并使用两个接口的方法。