Вопрос

У меня есть некоторый код 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top