ИМО @ Коминтерн удар ногтем по голове;Этот ответ является еще одной возможной альтернативой.
Создайте интерфейс для него.Добавьте модуль класса, назовите его IMaterial
;этот интерфейс формализует свойства только для получения, необходимые Material
:
Option Explicit
Public Property Get Symbol() As String
End Property
Public Property Get Density() As Single
End Property
Теперь откройте Блокнот и вставьте заголовок этого класса:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "StaticClass1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Сохраните его как StaticClass1.cls
исохраните его в папке «часто необходимые файлы кода VBA» ( сделайте один, если у вас его нет!).
Теперь добавьте реализацию прототипа в текстовый файл:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "Material"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Implements IMaterial
Private Const mSymbol As String = ""
Private Const mDensity As Single = 0
Private Property Get IMaterial_Symbol() As String
IMaterial_Symbol = Symbol
End Property
Private Property Get IMaterial_Density() As Single
IMaterial_Density = Density
End Property
Public Property Get Symbol() As String
Symbol = mSymbol
End Property
Public Property Get Density() As Single
Density = mDensity
End Property
Сохраните этот текстовый файл как Material.cls
.
Теперь импортируйте этот класс Material
в ваш проект;переименуйте его в AluminiumMaterial
и заполните пробелы:
Private Const mSymbol As String = "AL"
Private Const mDensity As Single = 169.34
Импортируйте класс Material
еще раз, переименуйте его в AnotherMaterial
, заполните пробелы:
Private Const mSymbol As String = "XYZ"
Private Const mDensity As Single = 123.45
Промывайте и повторяйте для каждого материала: вам нужно вводить каждое значение только один раз для материала.
Если вы используете Rubberduck , добавьте аннотацию папки в файл шаблона:
'@Folder("Materials")
И тогда Code Explorer аккуратно перегруппирует все IMaterial
классы в папке Materials
.
Наличие "множества модулей" - проблема только в VBAпотому что VBE Project Explorer делает его довольно неудобным (помещая каждый отдельный класс в одну папку "classes"). Code Explorer от Rubberduck не даст VBA иметь пространства имен, но позволяет структурировать ваш проект VBA независимо от того.
С точки зрения использования теперь вы можете написать полиморфный код для *Интерфейс 1054 *:
Public Sub DoSomething(ByVal material As IMaterial)
Debug.Print material.Symbol, material.Density
End Sub
Или вы можете получить доступ к свойствам только для получения из открытого экземпляра по умолчанию (который вы получаете из атрибута VB_PredeclaredId = True
модулей):
Public Sub DoSomething()
Debug.Print AluminumMaterial.Symbol, AluminumMaterial.Density
End Sub
И вы можете передавать экземпляры по умолчанию в любой метод, который должен работать с IMaterial
:
Public Sub DoSomething()
PrintToDebugPane AluminumMaterial
End Sub
Private Sub PrintToDebugPane(ByVal material As IMaterial)
Debug.Print material.Symbol, material.Density
End Sub
С другой стороны, вы получаете проверку во время компиляции для всего;неправильно использовать типы.
Недостатки: вам нужно много модулей (классов), и если нужно изменить интерфейс, это приводит к обновлению большого количества классов, чтобы обеспечить возможность компиляции кода.