Подтвердить что ты не робот

Как получить значения свойств классов, реализующих интерфейс в окне Locals?

Это действительно беспокоит меня и препятствует моей разработке/отладке. Всякий раз, когда я объявляю переменный тип интерфейса, который я реализую, окно Locals не показывает его значения свойств. Вместо этого он просто читает

Объект не поддерживает это свойство или метод

Это глупо, потому что это абсолютно так. На самом деле он имеет, чтобы выполнить свой контракт с интерфейсом.

Если я объявляю переменную как конкретную реализацию интерфейса, окно работает так, как ожидалось. Тем не менее, это полностью поражает цель кодирования для абстракции для начала.

Как я могу заставить окно locals правильно отображать значения свойств класса?

Минимальный, полный и проверяемый пример:

Создайте класс 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

enter image description here

4b9b3361

Ответ 1

Я мог ошибаться, но я думаю, что это может быть связано с тем, как классы создаются в VBA.

Например:

Dim oClass1 as Class1
Set oClass1 = new Class1

отличается от

Dim oClass1 as New Class1

Во втором случае я считаю, что конструктор не вызывается до тех пор, пока не будет доступен доступ.

Если вы попробуете это, он увидит свойство в окне "Смотреть". Обратите внимание на New для 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

Я подозреваю, что это связано с этим, и окно просмотра требует этого... может быть...