Как предотвратить отображение резервных закрытых полей свойств класса в окне «Локальные»?

#vba #editor

Вопрос:

Хотя я опытный программист VBA, я впервые создаю свои собственные классы (объекты). Я удивлен, увидев, что все свойства «дублируются» в окне «Местные». Небольшой пример (перерыв в «Конце Sub»):

 ' Class module: Private pName As String  Public Property Let Name(inValue As String)  pName = inValue End Property Public Property Get Name() As String  Name = pName End Property  ' Normal module: Sub Test()  Dim objTest As cTest  Set objTest = New cTest  objTest.Name = "John Doe" End Sub  

Почему оба Name и pName показаны в окне «Местные»? Могу ли я каким-то образом избавиться от pName этого ?

Комментарии:

1. Он просто пытается быть полезным, показывая вам значение, пока вы отлаживаете. pName является частным и не предоставляется вызывающим пользователям через OBJECTEST.

Ответ №1:

Как уже говорилось в комментариях и ответах, это просто полезно для VBE.

Однако, если вам кажется шумным , чтобы личные поля и общедоступные члены были перечислены в окне инструментов locals, есть способ красиво их очистить — здесь я поместил Test процедуру внутрь ThisWorkbook и оставил класс с именем Class1 :

очистить окно инструментов

Так что же здесь происходит? Что это this ?

Вот Class1 :

 Option Explicit  Private Type TClass1  Name As String  '...other members... End Type  Private this As TClass1  Public Property Get Name() As String  Name = this.Name End Property  Public Property Let Name(ByVal value As String)  this.Name = value End Property  

В классе есть только 1 закрытое поле, определенное пользователем значение типа с именем this , которое содержит все элементы инкапсулированных данных.

В результате базовые поля свойств эффективно скрыты, или, скорее, все они перегруппированы this , поэтому вы не увидите значения базовых полей, если не захотите их видеть:

в окне инструментов расширено поле quot;этоquot;

И в качестве дополнительного преимущества вам больше не нужны псевдовенгерские префиксы, реализации свойств кристально чисты, и, что лучше всего, свойства имеют точно такое же имя идентификатора, как и их резервное поле.

Комментарии:

1. Мне нравится эта идея, пришло время переписать все мои классы, чтобы реализовать ее.

2. @BSlater побочным эффектом этого является то, что вы обнаружите, что он также делает сериализацию состояния объекта в двоичный файл прогулкой в парке =)

Ответ №2:

Все окна проверки показывают вам не только общедоступный интерфейс объектов, но и их частные элементы. АФАИК, ты ничего не можешь с этим поделать.

Считайте, что это хорошая функция, позволяющая получить еще больше информации во время отладки.

По моему опыту, это не так важно для объектов реального мира, поскольку у них, как правило, больше полей и свойств. Предполагая согласованное именование (как показано в вашем примере), поля и свойства хорошо сгруппированы вместе.