我试图实现一个在Excel中实现两个接口的新类,但是我遇到了编译问题,因为接口的成员似乎没有在实现类中正确实现(它们是不可调用的)。
接口如下:
ICrawlable
Option Explicit
Public Function GetCrawler() As ICrawler
End FunctionIEquatable
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我使用这两个第一个接口创建了一个示例类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支持。此外,代码没有编译,我在这个模块代码中得到了一个“方法或数据成员找不到”,突出显示了.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中的一个bug吗?我是否在接口中声明了不允许的内容(我已经尝试将所有返回数据类型更改为Variant,并尝试禁用接口的每个功能)?我是否使用保留关键字(在对象资源管理器中,我没有看到接口名称的副本)?它在你的机器上编译吗?
发布于 2015-12-07 15:32:34
如果要使用接口中的方法,则必须将变量声明为此接口类型:
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 ICrawlerVBA不会理解这是接口方法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现在,您可以将变量TestInstance声明为InterfaceTester类,并使用来自两个接口的方法。
https://stackoverflow.com/questions/34136745
复制相似问题