Вопрос
У меня есть некоторый код VB (на самом деле VBA), который в основном такой же, за исключением типа, с которым он работает.Поскольку я считаю, что принцип DRY является хорошим руководящим принципом для разработки программного обеспечения, я хочу написать одну процедуру для всех различных типов, с которыми необходимо работать.Например, если бы у меня было два фрагмента кода, подобных этим:
Dim i as Obj1
Set i = RoutineThatReturnsObj1()
i.property = newvalue
Dim i as Obj2
Set i = RoutineThatReturnsObj2()
i.property = newvalue
Я бы хотел иметь что-то подобное для обработки обоих экземпляров:
Sub MyRoutine(o as ObjectType, r as RoutineToInitializeObject, newvalue as value)
Dim i as o
Set i = r
i.property = newvalue
End Sub
Если бы я использовал C ++, я бы сгенерировал шаблон и больше ничего не говорил об этом.Но я использую VBA.Я почти уверен, что в определении языка VBA нет таких возможностей, как шаблоны C ++, но есть ли какие-либо другие средства, с помощью которых я мог бы добиться того же эффекта?Я предполагаю, что ответ отрицательный, но я спрашиваю здесь, потому что, возможно, есть какая-то функция VBA, которую я пропустил.
Решение
В VB6 нет ничего, что могло бы это сделать.Если вы обновитесь до Visual Studio Tools для Office с помощью .Net, вы сможете использовать универсальные:
Function MyRoutine(Of O)(R As Delegate, newvalue As Object) As O
Dim i As O = CType(r.Method.Invoke(Nothing, Nothing), O)
'you need another parameter to tell it which property to use'
' and then use reflection to set the value'
i.property = newvalue
return i
End Function