Excel 接口问题
我试图实现一个新类,该类正在Excel VBA中实现两个接口,但我遇到了编译问题,因为接口的成员在实现类中似乎没有正确实现(它们不可调用) 接口如下所示:Excel 接口问题,excel,vba,interface,ms-office,Excel,Vba,Interface,Ms Office,我试图实现一个新类,该类正在Excel VBA中实现两个接口,但我遇到了编译问题,因为接口的成员在实现类中似乎没有正确实现(它们不可调用) 接口如下所示: ICrawlable: Option Explicit Public Function GetCrawler() As ICrawler End Function Option Explicit Public Function Equals(CompareObject As Variant) As Boolean End Funct
ICrawlable
:
Option Explicit
Public Function GetCrawler() As ICrawler
End Function
Option Explicit
Public Function Equals(CompareObject As Variant) As Boolean
End Function
IEquatable
:
Option Explicit
Public Function GetCrawler() As ICrawler
End Function
Option Explicit
Public Function Equals(CompareObject As Variant) As Boolean
End Function
然而,ICrawler
还包含一个返回接口的函数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中的错误吗?我是否在接口中声明了不允许的内容(我已尝试将所有返回数据类型更改为Variant,并尝试禁用接口的每个函数)?我是否使用保留关键字(在对象资源管理器中,我看不到重复的接口名称)?
它是否在您的计算机上编译?如果要使用接口中的方法,必须将变量声明为此接口类型:
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
class-Equals
和GetCrawler
添加另外两个公共方法。实施方法应仅针对以下方法:
InterfaceTester
class:
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
类,并使用两个接口的方法。好的,非常感谢您的解释和最佳实践提示:D!真的很有帮助!我在这里应用了C#逻辑,并期望接口成员自动成为公共类成员的一部分,即使它们使用VBA表示法是私有的。