Вы можете получить экземпляр по умолчанию, используя Class_Initialize и статическую функцию внутри класса для хранения экземпляра по умолчанию.
Использование примера выдержки из моего класса clsCustomer, который имеет VB_PredeclaredId = True
«Примечание. Class_Initialize вызывается при первом обращении к clsCustomer». Вы также можете делать такие вещи, как If Not Me Is clsCustomer.для одноэлементных классов, т.е. не может создать экземпляр, отличный от экземпляра по умолчанию
Private Sub Class_Initialize ()
If Me Is clsCustomer Then
GetDefaultInstance
End If
End Sub
Статическая функция GetDefaultInstance () As clsCustomer
Dim pvtDefaultInstance As clsCustomer
If pvtDefaultInstance Is Nothing Then
If Not Me Is Nothing Then
Set pvtDefaultInstance = Me
End If
End If
Set GetDefaultInstance = pvtDefaultInstance
Функция завершения
В модуле для проверки
Sub TestDefaultInstance ()
Dim pvtCustomer As clsCustomer
Debug.Print ObjPtr(clsCustomer.GetDefaultInstance)
Debug.Print ObjPtr(pvtCustomer)
Set pvtCustomer = New clsCustomer
Debug.Print ObjPtr(clsCustomer.GetDefaultInstance)
Debug.Print ObjPtr(pvtCustomer)
Debug.Print IsDefaultInstance(clsCustomer.GetDefaultInstance, pvtCustomer)
End Sub
Открытая функция IsDefaultInstance (byval defaultObject as Object, byval compareObject as Object) As Boolean
Dim isDefault as Boolean
if defaultObject is compareObject then
isDefault = True
End if
IsDefaultInstance = isDefault
End Function
Output
2401988144720 (экземпляр по умолчанию)
0 (Экземпляр pvtCustomer еще не установлен и равен нулю)
2401988144720 (экземпляр по умолчанию)
2401988142160 (Новый экземпляр pvtCustomer, который не являетсясовпадает с экземпляром по умолчанию)
False (False, возвращаемое как экземпляр объекта клиента по умолчанию, не совпадает с новым объектом pvtCustomer)
Примечания: Выходной ObjPtr будет меняться при каждом запуске, т.е.ссылки на память и только для примера.