Как и многие современные языки, VB6 имеет типы значений и ссылочные типы. Классы определяют ссылочные типы. С другой стороны, ваши базовые типы, такие как Integer
, являются типами значений.
Основная разница в назначении:
Dim a as Integer
Dim b as Integer
a = 2
b = a
a = 1
В результате a
равно 1, а b
равно 2. Это потому, что присваивание в типах значений делает копию. Это связано с тем, что каждой переменной выделено место для значения в стеке (в случае VB6 целое число занимает в стеке 2 байта).
Для классов это работает иначе:
Dim a as MyClass
Dim b as MyClass
Set a = New MyClass
a.Value1 = 2
Set b = a
a.Value1 = 1
В результате оба значения a.Value1
и b.Value1
равны 1. Это потому, что состояние объекта хранится в куче, а не в стеке. В стеке хранится только ссылка на объект, поэтому Set b = a
перезаписывает ссылку. Интересно, что VB6 явно говорит об этом, заставляя вас использовать ключевое слово Set
. Большинство других современных языков не требуют этого.
Теперь вы можете создавать свои собственные типы значений (в VB6 они называются пользовательскими типами, но в большинстве других языков они называются структурами или структурами). Вот учебник .
Различия между классом и определяемым пользователем типом (кроме класса, являющегося ссылочным типом, и UDT, являющегося типом значения) заключается в том, что класс может содержать поведения (методы и свойства), в которых UDT не может. Если вы просто ищете класс типа записи, то UDT может быть вашим решением.
Вы можете использовать сочетание этих техник. Допустим, вам нужен класс, потому что у вас есть определенные поведения и расчеты, которые вы хотите включить в данные. Вы можете использовать шаблон memento для хранения состояния объекта внутри UDT:
Type MyMemento
Value1 As Integer
Value2 As String
End Type
В вашем классе убедитесь, что all ваше внутреннее состояние хранится внутри закрытого члена типа MyMemento
. Напишите свои свойства и методы, чтобы они использовали данные только в этой закрытой переменной-члене.
Теперь сделать копию вашего объекта просто. Просто напишите в вашем классе новый метод с именем Copy()
, который возвращает новый экземпляр вашего класса, и инициализируйте его копией собственного сувенира:
Private Memento As MyMemento
Friend Sub SetMemento(NewMemento As MyMemento)
Memento = NewMemento
End Sub
Public Function Copy() as MyClass
Dim Result as MyClass
Set Result = new MyClass
Call Result.SetMemento(Memento)
Set Copy = Result
End Function
Friend
скрывает его только от материалов, находящихся вне вашего проекта, поэтому скрывать сабвуфер SetMemento
не так уж и много, но это все, что вы можете сделать с VB6.
НТН