объектно-ориентированное программирование и вопрос теневого копирования в vba - PullRequest
0 голосов
/ 07 февраля 2020

Я недавно работаю над большим проектом, основанным на VBA, который должен создать много классов. Внезапно я обнаружил, что set object = other object по умолчанию является теневым копированием, что является самой большой проблемой для меня, чтобы продолжить. Мне нужно использовать объекты для инициализации других объектов и изменения их внутри объекта, но я не хочу, чтобы исходный объект был изменен. На другом языке, таком как C ++, это очень легко реализовать, просто создайте переменную-член внутри объекта и сделайте глубокое копирование. Но в vba теневое копирование используется по умолчанию при установке объекта. Я искал много ресурсов в Интернете, которые учат вас, как делать глубокое копирование вручную, что, на мой взгляд, хорошо для небольшого проекта. В моем коде есть тонны этой логики c, которые мне нужны для реализации глубокого копирования.

На самом деле я не хочу спрашивать, как сделать глубокое копирование с точки зрения объекта, потому что я думаю, что ресурсы уже учат меня. Я просто спрашиваю, когда вам нужно сделать большой проект в VBA, который должен использовать много классов. Как вы справляетесь с такого рода проблемами?

Я стараюсь привести пример как можно больше

Class Risk ' for simplification, just let Risk has one member variable and it's public so i don't need to write another method in order to change the value
public value as double


Class Profile    

dim reportingRisks As Collection ' is a collection of a class risk
dim profileShocks As Collection
sub init() 'this is used to initialize the member variables like reportingRisks in class Profile 
...
end sub

Class Asset
Dim reportingRisks as Collection
Dim profileShocks as Collection   
sub init(aProfile as Profile, str as string) ''this is used to initialize the member variables in Asset class, in this part, we need to use information both in aProfile and str to initialize and we want aProfile are same each time, str would be different
set reportingRisks = aProfile.reportingRisks
' then based on the information from str, the element in the reportingRisks would change
reportingRisks(0).value = cint(str)
end sub


'Then in the main sub
sub main()
dim assets as new collection
dim theProfile as new Profile
theProfile.init
dim str as variant
str = readsomefile() ' assume this str is assigned by reading the a multiple lines file and it becomes a array, each element is a number
dim temp as variant
dim ass as Asset
for each temp in str
set ass = new Asset
ass.init theProfile, temp ' I pass theProfile into this Procedure, and cause the temp is different, so the element in theProfile like reportingRisks will change everytime, but I don't want it change.
assets.add ass
next temp
end sub

И это просто очень упрощенный пример, в проекте есть тонны таких процедур, которые я надеваю не хотите, чтобы исходный аргумент был изменен из-за того, что их параметр был изменен внутри функции или подпрограммы, например, reportRisk (0) .value = cint (str). У тебя есть какой-нибудь совет? Вероятно, способ, которым я строю код, неправильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...