首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >界面问题

界面问题
EN

Stack Overflow用户
提问于 2015-12-07 15:06:54
回答 1查看 92关注 0票数 5

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

接口如下:

ICrawlable

代码语言:javascript
复制
Option Explicit

Public Function GetCrawler() As ICrawler

End Function

IEquatable

代码语言:javascript
复制
Option Explicit

Public Function Equals(CompareObject As Variant) As Boolean

End Function

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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,并尝试禁用接口的每个功能)?我是否使用保留关键字(在对象资源管理器中,我没有看到接口名称的副本)?它在你的机器上编译吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-07 15:32:34

如果要使用接口中的方法,则必须将变量声明为此接口类型:

代码语言:javascript
复制
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实现方法中,如下所示:

代码语言:javascript
复制
Private Function ICrawlable_GetCrawler() As ICrawler

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

代码语言:javascript
复制
Public Function GetCrawler() As ICrawler

VBA不会理解这是接口方法GetCrawler的实现。

为了克服这个问题,您应该向InterfaceTester类中添加另外两个公共方法-- EqualsGetCrawler。实施方法应只针对以下方法:

InterfaceTester类:

代码语言:javascript
复制
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类,并使用来自两个接口的方法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34136745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档