OOP шаблон для обмена ссылками (с использованием VBA) - PullRequest
1 голос
/ 08 апреля 2020

Я начинаю изучать OOP, так что извините меня (или предложите предложения), если мой UML не соответствует стандартам.

В настоящее время пишу в VBA из-за бизнес-ограничений, поэтому у меня нет доступа наследовать, но у него есть поддержка событий и интерфейсов.

У меня есть класс Folder (синим цветом), в котором есть объект mFileSystemObject типа FileSystemObject

Класс Folder содержит много объектов File в массиве с именем Files.

Каждый файл Объект имеет объект FileDetails (зеленый).

Я хотел бы использовать функции из класса FileSystemObject в классе FileDetails.

Я хотел бы использовать тот же экземпляр FileSystemObject в классе Folder, поскольку я не хочу создавать новый экземпляр для каждого класса FileDetails и заполнять кучу, и я не делаю никакой работы одновременно.

Поэтому я хотел бы передать ссылку на класс FileDetails, чтобы они все использовали один и тот же.

Единственный способ, которым я могу думать об этом, - это передать его через Файловый объект, даже несмотря на то, что File не будет использовать его, что кажется немного уродливым.

Мой вопрос - есть ли шаблон, который решает эту проблему "прохождения" - я искал в Интернете и просмотрел несколько шаблонов проектирования но они не видели, чтобы предложить какие-либо предложения для решения.

Любая помощь будет принята с благодарностью.

Большое спасибо

Ник

enter image description here

1 Ответ

1 голос
/ 08 апреля 2020

Так что это будет одноэлементный паттерн; Есть несколько способов сделать это в VBA. Я дам вам два.

1) Создайте новый модуль, назовем его FileDetailsBuilder. В этом модуле дайте ему частный экземпляр вашего FileDetails класса. Затем откройте функцию publi c, которая будет возвращать свой экземпляр, или создайте новый, если он не существует.

Option Explicit

Private mFD As FileDetails

Public Function GetObject() As FileDetails
    If mFD Is Nothing Then
        Set mFD = New FileDetails
    End If
    Set GetObject = mFD
End Function

Теперь, когда вы создаете новые File объекты, вы можете установить их * Элемент 1009 *, использующий следующую строку кода:

Set mFileDeatils = FileDetailsBuilder.GetObject()

Элемент экземпляра mFD будет работать до тех пор, пока ваше приложение работает.

2 ) Вы можете изменить некоторый код в своем классе FileDetails, чтобы он воспринимался как отдельный предварительно объявленный объект. Для этого вам нужно экспортировать класс и изменить некоторый код, который вы не видите в VBE.

В текстовом редакторе в верхней части экспортированного файла .cls вы увидите некоторые назначения атрибутов. Одним из которых является VB_PredeclaredId. Ну, мой друг, вы можете отредактировать этот файл .cls и установить для этого атрибута значение true:

Attribute VB_PredeclaredId = True

Сохраните файл и импортируйте его обратно в проект VBE. Теперь вам не нужно создавать экземпляр этого объекта. Просто используйте его как объект c. Когда вы создаете новые File объекты, присваивайте их элементам так:

Set mFileDeatils = FileDetails '// note the lack of new keyword

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