Создать класс с несколькими индексированными свойствами - PullRequest
0 голосов
/ 14 декабря 2018

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

'dataTypeClass class module
Private ap() As String
Private dt() As String

Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property

Public Property Get dataType(index As Long) As Variant
Set dataType = dt(index)
End Property

Public Property Let apos(index As Long, apVal As String)
ap(index) = apVal
End Property

Public Property Let dataType(index As Long, dtVal As String)
dt(index) = dtVal
End Property

Я получаю этот код ошибки в основном:

enter image description here

Ожидается использовать ниже, чтобы получить "INT" и "" для пункта 1 в подпункте ниже.

Sub classTest()

Dim d As New dataTypeClass
d(1).dataType = "INT"
d(1).apos = ""
Debug.Print d(1).dataType & d(1).apos
End Sub

Какие несколько вещей я делаю неправильно?

РЕДАКТИРОВАТЬ: Принимая предложения ниже (например, редактирование моего вопроса, а не комментирование), я устанавливаю варианты для строк и использую let вместо set.Поскольку я действительно получил индекс вне диапазона, мне нужно инициализировать класс, но нужно ли мне redim index?Как я могу это сделать, если индекс будет иметь разные максимумы при каждом запуске скрипта?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Свойство apos 1 получает Variant по указанному index;реализация предполагает, что инкапсулированный ap(index) является Object, поэтому тип возвращаемого значения, вероятно, должен быть Object вместо Variant:

Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property

Сеттер использует присваивание Let, котороехак, но допустимо, учитывая значение Variant - о, нет, это String!

Public Property Let apos(index As Long, apVal As String)
ap(index) = apVal
End Property

Вы получаете эту ошибку, потому что, как говорится в ошибке, определение свойства не согласовано.Если ap(index) - это String, то геттер должен выглядеть следующим образом:

Public Property Get apos(index As Long) As String
apos = ap(index)
End Property

Если ap(index) - это Object, то установщик должен выглядеть следующим образом:

Public Property Set apos(index As Long, apVal As Object)
Set ap(index) = apVal
End Property

... и геттер вот так:

Public Property Get apos(index As Long) As Object
Set apos = ap(index)
End Property

Или вот так:

Public Property Get apos(index As Long) As Variant
Set apos = ap(index)
End Property

Public Property Set apos(index As Long, apVal As Variant)
Set ap(index) = apVal
End Property

Другими словами:

  • Параметр RHS / value Property Let / Property Set должен быть того же типа, что и тип возврата элемента с тем же именем Property Get.
  • Если тип является типом объектаиспользуйте Property Set для назначений.
  • Если тип является типом значения, используйте Property Let для назначений.
  • Избегайте Variant, если это возможно.
  • Неиспользуйте Set, чтобы назначить что-либо кроме ссылки на объект.

1 Все это также верно для свойства dataType.

0 голосов
/ 14 декабря 2018

У вас есть вариант для типа возврата вашего Get, но ваш дополнительный параметр Let использует строку.Возможно, вам нужно dtVal As Variant?Как упомянуто в комментариях и других ответах, есть дополнительные вещи для рассмотрения;некоторые будут зависеть от реализации.

Цитата:

Параметры для свойств Get, Property Let и Property Setprocedures для одного и того же свойства должны точно совпадать, за исключением того, чтоСвойство Let имеет один дополнительный параметр, тип которого должен соответствовать типу возврата соответствующего свойства Get, а набор свойств имеет на один параметр больше, чем соответствующий параметр свойства Get, тип которого является либо Variant, Object, именем класса или объектомтип библиотеки, указанный в объектной библиотеке.Эта ошибка имеет следующие причины и решения:

Количество параметров для процедуры Get Property не на единицу меньше, чем количество параметров для соответствующей процедуры Property Let или Property Set.При необходимости добавьте параметр в свойство Let или Property Set или удалите параметр из Property Get.

Типы параметров Property Get должны точно соответствовать соответствующим параметрам Property Let или Property Set, за исключением дополнительного свойстваУстановите параметр.Измените объявления параметров в соответствующих определениях процедур, чтобы они соответствовали соответствующим образом.

Тип параметра дополнительного параметра свойства Let должен соответствовать типу возврата соответствующей процедуры Get Property.Измените либо объявление дополнительного параметра в свойстве «Свойство», либо тип возвращаемого значения соответствующего свойства «Get», чтобы они соответствовали соответствующим образом.

Тип параметра дополнительного параметра в наборе свойств может отличаться от типа возвращаемого значения параметрасоответствующего свойства Get, но это должен быть тип библиотеки Variant, Object, class или validobject.

Убедитесь, что дополнительным параметром процедуры Property Set является Variant, Object, class name илитип библиотеки объектов.

Вы определили процедуру Property с параметром Optional или ParamArray.ParamArray и необязательные параметры не разрешены в процедурах свойств.Переопределите процедуры без использования этих ключевых слов.

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