Метод, который я использовал в прошлом, помещает все переменные экземпляра в UDT. Пока вы поддерживаете UDT в актуальном состоянии, вы можете копировать данные класса с помощью одного метода / оператора.
Для класса "Person" приведем простой пример:
</p>
<pre><code>Private Type tPerson
ID As Long
FirstName As String
LastName As String
End Type
Private m_Person As tPerson
Public Sub InitPerson(ID As Long, FirstName As String, LastName As String)
m_Person.ID = ID
m_Person.FirstName = FirstName
m_Person.LastName = LastName
End Sub
Friend Sub SetData(PersonData As tPerson)
m_Person = PersonData
End Sub
Public Function GetClone() As Person
Dim p As New Person
p.SetData m_Person
Set GetClone = p
End Function
Public Property Get FirstName() As String
FirstName = m_Person.FirstName
End Property
Чтобы попробовать код:
</p>
<pre><code>Dim p As New Person
p.InitPerson 1, "MyName", "MyLastName"
Dim p2 As Person
Set p2 = p.GetClone
MsgBox p2.FirstName
Если вы поддерживаете все переменные экземпляра внутри UDT вместо того, чтобы объявлять их отдельно, у вас может быть простой метод Clone, который требует минимального обслуживания.
Еще одним преимуществом является то, что вы можете поместить UDT в дескриптор файла для быстрой сериализации на диск.
</p>
<pre><code>Public Sub Save(filePathName As String)
Dim f As Integer
f = FreeFile()
Open filePathName For Binary Access Write Lock Read Write As #f
Put #f, , m_Person
Close #f
End Sub
Плохое мужское решение для сериализации на самом деле: -)