提问人:RubberDuck 提问时间:3/19/2015 最后编辑:RubberDuck 更新时间:12/28/2022 访问量:1933
如何获取在“局部变量”窗口中实现接口的类的属性值?
How to get property values of classes that implement an interface in the Locals window?
问:
这真的困扰着我,阻碍了我的开发/调试。每当我声明要实现的接口的变量类型时,局部变量窗口都不会显示它的属性值。相反,它只是读取
对象不支持此属性或方法
这很愚蠢,因为它绝对如此。事实上,为了履行与接口的合同,它必须这样做。
如果我将变量声明为接口的具体实现,则窗口将按预期工作。然而,这完全违背了编码到抽象的目的。
如何让局部变量窗口正确显示类的属性值?
最小、完整且可验证的示例:
创建一个类以用作接口。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
答:
-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 内部实现可能正在使用它。:)
评论