Вот способ реализации Factory Pattern в VBA, который очень хорошо описан на веб-сайте Rubberduck https://rubberduckvba.wordpress.com/2016/07/05/oop-vba-pt-2-factories-and-cheap-hotels/. Вот моя попытка объяснить это.Я знаю, что, возможно, есть более краткий способ сделать это, но я пытаюсь продемонстрировать две вещи: использование фабричного шаблона и внедрение зависимостей для создания объектов без необходимости их нового создания;и возможность использовать полиморфизм в VBA, так что может быть несколько различных реализаций абстрактного класса интерфейса.Открыта для обратной связи.Вот так:
- Создайте простой интерфейсный класс с именем IExampleClass и установите для него следующие члены:
Option Explicit
Public Property Get Firstname() As String
End Property
Public Property Get Lastname() As String
End Property
Public Function ToString() As String
End Function
Создать класс реализации, ExampleClass.Обратите внимание, что у этого есть метод Create.Это ваш фабричный метод.Также обратите внимание на собственный метод получения, который позволяет методу Create использовать действительно аккуратный синтаксис:
Option Explicit
Private Type TExample
Firstname As String
Lastname As String
End Type
Private this As TExample
Implements IExampleClass
Public Property Get Firstname() As String
FirstName = this.Firstname
End Property
Public Property Let Firstname(Value As String)
this.Firstname = Value
End Property
Public Property Get Lastname() As String
Lastname = this.Lastname
End Property
Public Property Let Lastname(Value As String)
this.Lastname = Value
End Property
Public Property Get Self() As IExampleClass
Set Self = Me
End Property
Public Function Create(ByVal First As String, ByVal Last As String)
With New ExampleClass
this.Firstname = First
this.Lastname = Last
Set Create = Self
End With
End Function
Private Property Get IExampleClass_Firstname() As String
IExampleClass_Firstname = this.Firstname
End Property
Private Property Get IExampleClass_Lastname() As String
IExampleClass_Lastname = this.Lastname
End Property
Private Function IExampleClass_ToString() As String
IExampleClass_ToString = this.Firstname & " " & this.Lastname
End Function
Обратите внимание, как в этом классе реализована реализация каждого из членов вИнтерфейс имеет частную подпись, поэтому код, использующий этот ExampleClass, может получить доступ только к методу ToString из объекта интерфейса IExampleClass (abstract).
Теперь давайте создадим другой класс, который реализует интерфейс IExampleClass, назвав его BackwardsExampleClass:
Option Explicit
Private Type TExample
Firstname As String
Lastname As String
End Type
Private this As TExample
Implements IExampleClass
Public Property Get Firstname() As String
Firstname = this.Firstname
End Property
Public Property Let Firstname(Value As String)
this.Firstname = Value
End Property
Public Property Get Lastname() As String
Lastname = this.Lastname
End Property
Public Property Let Lastname(Value As String)
this.Lastname = Value
End Property
Public Property Get Self() As IExampleClass
Set Self = Me
End Property
Public Function Create(ByVal First As String, ByVal Last As String)
With New ExampleClass
this.Firstname = First
this.Lastname = Last
Set Create = Self
End With
End Function
Private Property Get IBackwardsExampleClass_Firstname() As String
IExampleClass_Firstname = this.Firstname
End Property
Private Property Get IBackwardsExampleClass_Lastname() As String
IExampleClass_Lastname = this.Lastname
End Property
Private Function IBackwardsExampleClass_ToString() As String
IExampleClass_ToString = this.Lastname & ", " & this.Firstname
End Function
Вот трюк, чтобы заставить этот Factory Class работать, чтобы вам не нужно было использовать новое ключевое слово для использования фабрики, и поэтому вы можете использовать Dependency Injection.Это трюк, который позволяет вам установить Factory как Singleton.Теперь ... вам нужно удалить ExampleClass и BackwardsExampleClass из вашего проекта, экспортировать его в папку, открыть каждый файл .cls в текстовом редакторе, установить для Predeclared Attribute значение «True», сохранить каждый файл .cls и повторно импортировать.оба файла классов в ваш проект.Это создает экземпляр по умолчанию обоих этих классов «Фабрика», которые реализуют интерфейс IExampleClass.
Теперь введите в ближайшей панели:
Debug.print ExampleClass.Create("John","Smith").ToString
и он вернет вывод «Джон Смит»
Далее Введите в ближайшей панели:
Debug.print BackwardsExampleClass.Create("John","Smith").ToString
и он будетвернуть вывод "Смит, Джон"