Этот ответ о VB6 довольно хорош , реализация шаблона сувенира и способ ссылки на свойства через тип в VBA - это то, что позволяет копировать свойства.
Создан объект типа Employee со свойствами Salary
, Age
и RelevantExperience
.Затем создается новый объект, копирующий старый с помощью функции .Copy
.Новый объект изначально имеет те же свойства, но мы можем изменить некоторые из них.В приведенном ниже коде Опыт и Возраст изменен, Зарплата не упоминается, поэтому он остается тем же:
Dim newEmp As Employee
Dim oldEmp As Employee
Set newEmp = New Employee
With newEmp
.Salary = 100
.Age = 22
.RelevantExperience = 1
End With
Set oldEmp = newEmp.Copy
With oldEmp
'Salary is the same as in the NewEmp
.Age = 99
.RelevantExperience = 10
End With
Это результат:
Старый Сотрудник получает такую же зарплату, "унаследованную" новым сотрудником, когда он копируется.Опыт и Возраст различны.
Полная реализация
В модуле:
Type MyMemento
Salary As Double
Age As Long
RelevantExperience As Long
End Type
Sub Main()
Dim newEmp As Employee
Dim oldEmp As Employee
Set newEmp = New Employee
With newEmp
.Salary = 100
.Age = 22
.RelevantExperience = 1
End With
Set oldEmp = newEmp.Copy
With oldEmp
'Salary is inherited, thus the same
.Age = 99
.RelevantExperience = 10
End With
Debug.Print "Salary"; vbCrLf; newEmp.Salary, oldEmp.Salary
Debug.Print "Experience"; vbCrLf; newEmp.RelevantExperience, oldEmp.RelevantExperience
Debug.Print "Age"; vbTab; vbCrLf; newEmp.Age, oldEmp.Age
End Sub
В модуле класса, называемом Employee
:
Private Memento As MyMemento
Friend Sub SetMemento(NewMemento As MyMemento)
Memento = NewMemento
End Sub
Public Function Copy() As Employee
Dim Result As Employee
Set Result = New Employee
Result.SetMemento Memento
Set Copy = Result
End Function
Public Property Get Salary() As Double
Salary = Memento.Salary
End Property
Public Property Let Salary(value As Double)
Memento.Salary = value
End Property
Public Property Get Age() As Long
Age = Memento.Age
End Property
Public Property Let Age(value As Long)
Memento.Age = value
End Property
Public Property Get RelevantExperience() As Long
RelevantExperience = Memento.RelevantExperience
End Property
Public Property Let RelevantExperience(value As Long)
Memento.RelevantExperience = value
End Property