Есть ли способ установить общий набор свойств для группы классов в VBA? - PullRequest
4 голосов
/ 11 августа 2011

Я работаю над проектом в , где у меня есть ряд классов, которые используются для запроса данных из различных источников.Поскольку эти классы похожи, я пытаюсь определить, является ли использование общего интерфейса и оператора Implements возможным вариантом для меня.Я довольно новичок в ООП в целом (хотя я пытаюсь учиться на языке, отличном от VBA), и я понимаю, что ООП в VBA оставляет желать лучшего.

Информация, которую я читал, в основном гласит, что вы настроили свой интерфейсный класс, который мы назовем IBaseInfo:

Public Property Let LocationData(ByRef locDATA As udtLocData)
End Property

Public Property Let ReferenceDate(ByVal dteDATE As Date)
End Property

Затем вы фактически реализуете IBaseInfo в своем классе, который мы назовем clsRate5pt:

Implements IBaseInfo

Private Property Let IBaseInfo_LocationData(Byref RHS As udtLocData)

End Property

Private Property Let IBaseInfo_ReferenceDate(ByVal RHS As Date)

End Property

Я запутался в том, как на самом деле я получаю доступ к свойствам на уровне объекта в модуле.Что я получаю из ссылки на полиморфизм VBA в msdn , так это то, что мне нужно фактически объявить переменную типа IBaseInfo, установить ее равной объекту типа clsRate5pt и получить доступ к свойствам черезэта переменная.Например:

Sub TestIFace()

    Dim o5PT As clsRate5Pt
    Dim oInfo As IBaseInfo

    Set o5PT = New clsRate5Pt
    Set oInfo = o5PT

    oInfo.LocationData = '// Some location Data
    oInfo.ReferenceDate = '// Some Reference Date

End Sub

Есть ли способ установить общий набор интерфейсов для группы классов в ?Implements путь, и если да, то что я делаю не так?

Просто кажется нелогичным доступ к свойствам через другой объект.Если clsRate5pt «реализует» интерфейс, не должен ли быть способ доступа к этим свойствам через clsRate5pt?

Ответы [ 3 ]

5 голосов
/ 11 августа 2011

VBA не поддерживает наследование ("is a"), но поддерживает композицию ("has a"), поэтому вы можете использовать этот подход в этом случае:

Например: класс "clsSettings" имеетобщие свойства и любые обязательные проверки значений свойств, которые вы хотите реализовать в других ваших классах.

Тогда у ваших других классов будет экземпляр ваших «настроек», который может быть представлен как:

objRate5pct.Settings.LocationData
objRate5pct.Settings.ReferenceDate
0 голосов
/ 04 октября 2018

Это очень старый вопрос, но я наткнулся на него сегодня, и, немного поработав над ним, я думаю, что оба предыдущих ответа либо неверны, либо не отвечают непосредственно на вопрос, так что вот мое решение сделать то, что ОП хотел.

Во-первых, позвольте мне сказать, что оба ваших класса IBaseInfo и clsRate5pt правильно определены для того, чего вы хотите достичь (поэтому я не буду воспроизводить их код здесь).

И да, вы можете использовать интерфейс в VBA, чтобы делать то, что вы хотите: гарантировать, что несколько классов предоставляют один и тот же базовый набор свойств, функций или методов (каждый из которых реализован по-своему).

Теперь, что не хватает, так это правильное определение и создание объекта:

Sub TestIFace()
    ' Define the object you want to use polymorphically, 
    ' by using the interface you want to implement
    Dim oInfo As IBaseInfo 
    '// Instantiate the object by the concrete class you want to use
    Set oInfo = new clsRate5pt 

    ' Finally, access the properties, methods or functions 
    oInfo.LocationData = ...
    oInfo.ReferenceDate = ...

End Sub

Теперь вы можете создавать другие классы, которые реализуют IBaseInfo и просто заменяют имя класса в строке

Set oInfo = new ...

для получения новой бизнес-логики для объекта oInfo.

Поймите, однако, что, поскольку oInfo имеет тип IBaseInfo, вы можете использовать только свойства, функции или методы, определенные в IBaseInfo. Вы можете привести oInfo к clsRate5pt для доступа к дополнительным функциональным возможностям, исключая этот класс, но это увеличит сцепление вашего кода и может в первую очередь победить цель определения интерфейса, который заключается в возможности переключения специфическая бизнес-логика очень легко.

0 голосов
/ 08 мая 2015

Для интерфейса iFooBar

Option Explicit
Public Property Get Foo() as String

End Property

Public Property Get Bar() as String

End Property

Затем в вашем классе (который мы будем называть cFooBar)

Option Explicit
Implements iFooBar

'Other class code

Public Property Get AsiFooBar() as iFooBar
    Set AsiFooBar = me
End Property

'More code

Затем вы можете ссылаться на методы iFooBar из модуля

dim cfb as cFooBar
set cfb = new cFooBar
debug.print cfb.AsiFooBar.Foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...