Если вы открываете библиотеку с помощью 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 интерфейс по умолчанию.