如何获取在“局部变量”窗口中实现接口的类的属性值?

How to get property values of classes that implement an interface in the Locals window?

提问人:RubberDuck 提问时间:3/19/2015 最后编辑:RubberDuck 更新时间:12/28/2022 访问量:1933

问:

这真的困扰着我,阻碍了我的开发/调试。每当我声明要实现的接口的变量类型时,局部变量窗口都不会显示它的属性值。相反,它只是读取

对象不支持此属性或方法

这很愚蠢,因为它绝对如此。事实上,为了履行与接口的合同,它必须这样做。

如果我将变量声明为接口的具体实现,则窗口将按预期工作。然而,这完全违背了编码到抽象的目的。

如何让局部变量窗口正确显示类的属性值?

最小、完整且可验证的示例:

创建一个类以用作接口。IClass

Option Explicit

Public Property Get Name() As String
End Property

创建一个实现接口的接口。Class1

Option Explicit

Implements IClass

Public Property Get Name() As String
    Name = "Class1"
End Property

Private Property Get IClass_Name() As String
    IClass_Name = Name
End Property

最后,在常规的 .bas 模块中的一些测试代码来说明这个问题。

Option Explicit

Public Sub test()
    Dim x As Class1
    Dim y As IClass

    Set x = New Class1
    Debug.Print x.Name

    Set y = New Class1
    Debug.Print y.Name

    Stop
End Sub

在此处输入图像描述

VBA OOP 接口 IDE

评论

16赞 mwolfe02 3/20/2015
可能最简单的解决方案是对整个VBA IDE进行逆向工程,找到Microsoft的错误,调整一些汇编级代码,然后...宾果游戏,一个有效的本地变量窗口。
15赞 mwolfe02 3/20/2015
事实上,我发现了一个真正奇妙的实现,这个评论太狭隘了,无法包含。
4赞 Blackhawk 5/13/2015
@mwolfe02费马参考:D道具
2赞 Maciej Los 7/29/2015
非常有趣的问题...好吧,这似乎是错误。我建议使用在 VB.NET (Visual Studio) 中实现接口的类创建自定义 *.dll。您可以简单地在其他计算机上使用它,但您需要在 GAC 中注册此 dll。这是我最喜欢的在 VBA 中使用自定义类的方式。
2赞 Maciej Los 7/30/2015
我过去的回答是:stackoverflow.com/questions/29563448/......

答:

-1赞 PaulG 2/2/2017 #1

我可能是错的,但我认为这可能与 VBA 中类的实例化方式有关。

例如:

Dim oClass1 as Class1
Set oClass1 = new Class1

不同于

Dim oClass1 as New Class1

在第二种情况下,我相信在访问属性之前不会调用构造函数。

如果尝试此操作,它将在“监视”窗口中看到该属性。请注意 IClass 的新功能 - 仅用于演示 - 我知道这不是这样做的方法:)

Public Sub test1()

    Dim x As Class1
    Dim y As IClass

    Set y = New IClass
    Set x = New Class1
    Debug.Print x.Name
    Debug.Print y.Name
    Stop

End Sub

我怀疑这与此有关,手表窗口需要这个......或。。。

评论

0赞 RubberDuck 2/3/2017
不幸的是,我不再有权访问 Office 安装来测试这一点。
7赞 Mathieu Guindon 2/3/2017
新建接口违背了目的 - 当然它会起作用,你看到的是一个恰好用前缀命名的类实例 - 这并不能使它成为一个接口。关键是,这个 VBE 错误使得针对接口编写的调试代码更难使用局部变量工具窗口进行调试。I
0赞 PaulG 2/3/2017
我知道这一点,这就是为什么我说'我知道这不是这样做的方法'。我的观点是试图演示两个调用之间的实例化差异,并且监视 Windows 内部实现可能正在使用它。:)