У меня есть два объекта, которые должны взаимодействовать друг с другом, называется Collateral
, другой называется Model
. Model
является абстрактным классом, реализуется Model_A
, Model_B
, Model_AB
. Каждый объект обеспечения имеет коллекцию models
как одно из своих свойств. Чтобы инициализировать каждый Model
, мне нужно будет использовать информацию от Collateral
(и еще один объект позволяет назвать его User_Input
), эта информация будет отличаться в зависимости от реализации Model
.Как инициализировать объект с помощью свойств инициализирующего объекта в VBA
Мой вопрос: можно ли использовать конструктор, который будет знать, какой объект его создает (в этом случае Model
Конструктор, который знает, что именно Collateral
его экземпляр)? Если я не предполагаю, что кто-то предложит мне использовать абстрактный заводский шаблон, если так, то как бы это выглядело (боюсь, я все еще зеленый, когда дело касается ООП)?
Для простоты предположим, что следующее:
Collateral
обладает свойствами А, В, С, Models_CollectionCollateral
вызовы процедурRun
для каждого изModels
она создала (имеет в Models_Collection)Model
имеет public Sub под названиемRun
, который реализован во всех классах ниже- Процедура
Run
Manipula тесCollateral
Model_A
требует свойство A для инициализацииModel_B
требует свойство В инициализироватьModel_AB
требует свойство A, B, чтобы инициализировать
Вот упрощенный код, как я предполагаю, что это должно выглядеть :
Сопутствующий
Dim A, B, C as Variant
Dim Model_Collection as Collection
Sub New_Model(Model_Type as String)
Model_Collection.Add(Model_Implementation)
End Sub
Sub Execute_Models()
For Each Model in Model_Collection
Model.Run(Me)
Next Model
End Sub
Модель
Sub Run()
End
Model_A
Implements Model
Sub Class_Initialize()
'Some code that takes property A from Collateral that Created this object
Sub Run(Collateral as Collateral)
'Some Code
End Sub
Model_B
Implements Model
Sub Class_Initialize()
'Some code that takes property B from Collateral that Created this object
Sub Run(Collateral as Collateral)
'Some Code
End Sub
Model_AB
Implements Model
Sub Class_Initialize()
'Some code that takes property A, and B from Collateral that Created this object
Sub Run(Collateral as Collateral)
'Some Code
End Sub
Мне нравится то, что вы делаете - ООП в VBA всегда приятно видеть. У VBA нет конструкторов, поэтому вы правы, вам понадобятся фабрики; 'Class_Initialize' не может быть параметризован и выполняется перед любым другим кодом в классе, поэтому вы не можете использовать его как конструктор. –
Просто немного разъяснить. Вы хотите, чтобы «Залог» создал объекты «Model»? Было бы приемлемо создавать их за пределами «Залога» и передавать их в него? – RubberDuck
Mat's Mug: Спасибо за быстрый ответ, можете ли вы предположить, что фабрика (и) будет выглядеть так: – sgp667