Создание скрытых членов класса и функций-членов в VBA - PullRequest
3 голосов
/ 29 марта 2019

Я видел, что вы можете создавать «скрытые» вещи в VBA, добавляя к их именам знак подчеркивания (или, возможно, какой-то другой недопустимый первый символ).Под скрытым я не подразумеваю частную, но я имею в виду публичную вещь, которая не будет появляться в автозаполнении VBE;вы должны знать о его существовании, если хотите его использовать.

Некоторые недавние примеры, которые я видел:

Функция _NewEnum в классе Collection (из )это вопрос), и я довольно часто создаю Enum следующим образом:

Public Enum SomeEnumeration
  [_First]
  FirstCategory = [_First]
  SecondCategory
  ThirdCategory
  [_Last] = ThirdCategory
  [_Invalid] = [_Last] + 1
End Enum

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

Мой вопрос таков: возможно ли использовать эту конструкцию для других целей, кроме перечислений?Я вижу, что Container может это сделать, но могу ли я сделать это сам.Т.е. как бы написать модуль класса со скрытой функцией:

' Class module SomeClass

' Illustration of what I want, but this will not compile
Public Function _Hidden() As Variant
  ' Return something
End Function

, а затем получить доступ к этой функции через

Dim Obj As New SomeClass
Obj.[_Hidden] ' This option should not be visible in the VBE autocomplete

Я попытался определить функцию с окружением [],но это также не работает.

Это было бы полезно, потому что я довольно часто использую экземпляры классов по умолчанию в качестве фабрики объектов в качестве обходного пути для факта, что конструктор класса VBA не принимает никаких аргументов.Тем не менее, когда вы делаете это, вы сталкиваетесь с проблемами, когда вам нужно раскрыть определенные части вашего класса, которые в действительности должны быть приватными и установлены в конструкторе.Если бы я мог назвать эти вещи как-то скрытыми, это сделало бы мои интерфейсы чище и предотвратило бы случайное использование.

1 Ответ

0 голосов
/ 29 марта 2019

Если вы используете экземпляр класса по умолчанию в качестве фабрики с функциями create и self, тогда вы можете также рассмотреть возможность использования интерфейса в качестве арбитра, какие функции являются частными, а какие - общедоступными.например, вместо использования обычного соглашения о присвоении имен I для интерфейсов у вас есть «Classprivate», который является определением класса, и «Class», который является интерфейсом.Нет никакого намерения иметь интерфейс для нескольких связанных объектов, просто как открытый / закрытый фильтр.

Это имеет ряд преимуществ.

  1. Вы можете сделать всеметоды и свойства класса public, что значительно облегчает модульное тестирование.

  2. Фабрика возвращает только интерфейсный объект, поэтому не возникает путаницы относительно того, используете ли вы экземпляр класса или интерфейс.

Надстройка Rubberduck для VBA делает создание интерфейсов почти тривиальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...