Различить членов класса и аргументы с тем же именем в VBA? - PullRequest
2 голосов
/ 10 марта 2019

Есть ли способ отличить членов класса от аргументов свойства / суб / функции с одинаковым именем в VBA?Например:

Class1:

Private Name As String

Property Let LastName(Name As String)
   this.Name = Name
End Property

Property Get LastName() As String
    Dim Name As String
    Name = "Mr. "
    LastName = Name & this.Name
End Property

В других языках вы можете использовать ключевое слово this для ссылки на член класса / экземпляра (?).Но как это в VBA решается?Я знаю, что вы могли бы использовать для разных имен.Но это не то, чего я хочу.

Спасибо за вашу помощь!

Ответы [ 2 ]

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

Вы можете создать объект This с типом, который Матье учит нас в private-this-as-tsomething

Просто создайте тип с помощью переменных и назначьте его для This.

Private Type TPerson
  Name As String
End Type

Private This As TPerson
Property Let LastName(Name As String)
   This.Name = Name
End Property

Property Get LastName() As String
    Dim Name As String
    Name = "Mr. "
    LastName = Name & This.Name
End Property

Не забудьте прочитать другие статьи на RubberDuckVBA, поскольку они дают много полезных идей для VBA-OOP.

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

В VBA ключевое слово для использования вместо this. равно Me. Однако это приводит к ошибке компиляции, если переменная, на которую ссылается класс, является закрытой (я не знаю, почему).Возможный обходной путь - изменить его на public.

''''  Class1
Private PrName As String
Public PbName As String

Property Let LastName(Name As String)
   Me.PrName = Name ' throws a compile error
   Me.PbName = Name ' OK
End Property

UPDATE: Вы также можете создать дополнительный слой функций / свойств оболочки - set_name и getName.Переменная Name тогда не потребует переименования или изменения области видимости.Также входные параметры исходных свойств остаются без изменений.

Private Name As String

Property Let LastName(Name As String)
   Call set_name(Name) ' throws a compile error
End Property

Private Sub set_name(new_name As String)
    ' wrapper
    Name = new_name
End Sub

Property Get getName() As String
    ' wrapper
    getName = Name
End Property

Property Get LastName() As String
    Dim Name As String
    Name = "Mr. "
    LastName = Name & Me.getName
End Property
...