RegExp vs IRegExp2: путаница с именем класса - PullRequest
1 голос
/ 14 февраля 2020

Пример:

Dim oRegEx As IRegExp2
Set oRegEx = New regexp

Альтернатива:

Dim oRegEx As regexp
Set oRegEx = New regexp

Оба дают одинаковый результат, то есть объект с именем "oRegEx" типа "RegExp / IRegExp2", как показано в Введите столбец окна Locals.

В обозревателе объектов для библиотеки VBScript_RegExp_55 отображается только класс "RegExp".

Итак, мои вопросы:
1) что такое "IRegExp2" ?
2) Должен ли я предпочесть «IRegExp2» или «regexp» в строке Dim?
3) Каковы различные значения первого и второго имени в столбце «Тип» окна «Locals»?

1 Ответ

0 голосов
/ 14 февраля 2020

Если вы открываете библиотеку с помощью oleview, это определение IDL:

[
  uuid(3F4DACA4-160D-11D2-A8E9-00104B365C9F)
]
coclass RegExp {
    [default] interface IRegExp2;
};

Способ работы VB6 / VBA; они выставляют coclass как первоклассный объект, поэтому вы видите RegExp в браузере объектов. Однако вам не мешают использовать интерфейсы, поэтому VBA / VB6 позволяет вам делать Dim foo As IRegExp2 и, таким образом, заменять реализацию какой-либо другой реализацией (по крайней мере, теоретически). Поскольку RegExp является единственной реализацией интерфейса IRegExp2, практической разницы нет. Если бы вы создали класс, который реализует IRegExp2, то было бы разумно объявить переменные как IRegExp2, чтобы у вас была свобода использования либо реализации VBScript, либо вашей пользовательской реализации.

Обратите внимание, что есть также IRegExp. Однако IRegExp2 не вытекает из этого. Тем не менее, они очень похожи, и вы можете назначить его, даже если это явно не указано в IDL:

Public Sub test()
    Dim i1 As IRegExp
    Dim i2 As IRegExp2
    Dim o As RegExp

    Set o = New VBScript_RegExp_55.RegExp
    Set i2 = o
    Set i1 = o
End Sub

Причина, по которой это работает, заключается в том, что вы можете иметь свой старый код, который был изначально написан против исходная библиотека RegExp 1.0 продолжает работать с использованием библиотеки RegExp 5.5, фактически не изменяя ваш код.

Важно отметить, что, хотя VBA / VB6 показывает коклассы, на самом деле вы всегда работаете с интерфейсами COM. под капотом. Мы можем притворяться, что они «классовые» из-за того, что у coclass интерфейс по умолчанию.

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