Не более чем есть причины использовать this
в Java, C # или любом другом языке: это зарезервированный идентификатор, который представляет текущий экземпляр класса - что вы делаете с этим, зависит от вашего воображения.
Каков предпочтительный способ доступа объекта к его собственным членам?
Действительно, объекту не нужно ключевое слово Me
для доступа к своему общедоступному интерфейсу.То же, что и this
на других языках, я бы даже назвал это избыточным.Однако иногда может быть хорошей идеей явно квалифицировать вызовы членов с помощью Me
, особенно когда у класса есть атрибут VB_PredeclaredId
(например, любой UserForm
): ссылка на UserForm1
в коде позади UserForm1
возвращает ссылку на экземпляр по умолчанию класса, тогда как квалифицированный член вызывает с Me
, возвращает ссылку на текущий экземпляр этого класса.
Доступ к унаследованным членам
Код пользователя VBA не может выполнять наследование классов, но многие классы VBA do имеют базовый класс.Члены UserForm
, когда вы находитесь в коде позади UserForm1
, и члены Worksheet
, когда вы находитесь в коде позади Sheet1
, не всегда легко найти.Но поскольку унаследованные члены отображаются в IntelliSense / auto-complete, вы можете набрать Me.
и просмотреть список членов, унаследованных от базового класса, членов, о которых в противном случае вам нужно было бы знать, чтобыinvoke.
Класс, создающий экземпляр себя внутри себя?То, что я никогда не видел.
Вы пропускаете!Я делаю это все время, чтобы включить ссылку на экземпляр объекта, содержащийся в блоке With
, внутри Factory Method - как этот класс GridCoord .
Public Function Create(ByVal xPosition As Long, ByVal yPosition As Long) As IGridCoord
With New GridCoord
.X = xPosition
.Y = yPosition
Set Create = .Self
End With
End Function
Public Property Get Self() As IGridCoord
Set Self = Me
End Property
Обратите внимание, что в то время как класс GridCoord
предоставляет геттер и сеттер для свойств X
и Y
, интерфейс IGridCoord
предоставляет только геттеры.В результате код, написанный для интерфейса IGridCoord
, эффективно работает со свойствами, доступными только для чтения.
Другим способом является получение имени модуля класса без необходимости его жесткого кодирования.Это особенно полезно при возникновении пользовательских ошибок: просто используйте TypeName(Me)
для Source
ошибки.
Pattern Builder , как известно, возвращает Me
, что позволяетКонструкция «плавного API», которая позволяет писать код, который постепенно создает сложные объекты через цепочечные вызовы членов, где каждый член возвращает Me
(кроме заключительного вызова Build
, который возвращает тип создаваемого класса):
Dim thing As Something
Set builder = New ThingBuilder
Set thing = builder _
.WithFoo(42) _
.WithBar("test") _
.WithSomething _
.WithSomethingElse
.Build