создание анонимных экземпляров пользовательского класса в VB6 - PullRequest
2 голосов
/ 28 февраля 2012

Мне дано понять, что в пользовательских классах VB6 нельзя указывать конструкторы. Таким образом, передается объект Collection с именами сущностей, измеренных в основном кодовом блоке, и пользовательский класс с именем Entity:

Public Class Entry
'local variable(s) to hold property value(s)
Private mvarcurrNameValue As String 'local copy
Private mvarnewwNameValue As String 'local copy

Public Property Let newwNameValue(ByVal vData As String)
    mvarnewwNameValue = vData
End Property

Public Property Get newwNameValue() As String
    newwNameValue = mvarnewwNameValue
End Property

Public Property Let currNameValue(ByVal vData As String)
    mvarcurrNameValue = vData
End Property

Public Property Get currNameValue() As String
    currNameValue = mvarcurrNameValue
End Property
End Class

как мне достичь следующей идиомы C ++ / VB.NET в области VB6?

For Each foo In bar
   entities.Add (new Entity("Sinatra","Frank"))     'VB.NET seems to like this but not VB6
Next

Я не знаю заранее, сколько будет экземпляров сущностей.

ТИА

Все еще учусь, Стив

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Попробуйте фабричный метод

Public function NewEntry(a, b) As Entry
   Dim o As Entry
   Set o = New Entry
   o.a = a
   o.b = b
   Set NewEntry = o
End Function

, а затем

For Each foo In bar 
   entities.Add NewEntry("Sinatra","Frank")
Next 
1 голос
/ 28 февраля 2012

Два других ответа хороши, и я использовал оба подхода.Но я решил поставить другое простое решение.Вот как это делает vanila VB6:

Dim tempEntity As Entity
For Each foo In bar
   Set tempEntity = New Entity
   tempEntity.currNameValue = "Sinatra"
   tempEntity.newwNameValue = "Frank"
   Call entities.Add(tempEntity) 
   'Or if you prefer the no parens style use this:
   'entities.Add tempEntity
Next foo

Примечание к соглашению об именах, ведущие имена методов / свойств в нижнем регистре распространены в Java, но не в .NET или VB6.

1 голос
/ 28 февраля 2012

Чтобы установить свойства и вызвать методы для экземпляра объекта, вам необходимо сначала присвоить его переменной.После назначения вы можете установить свойства напрямую или использовать собственный метод Init().

В классе:

Public Sub Init(ByVal NewName As string, ByVal CurName As String)
  mvarnewwNameValue = NewName
  mvarcurrNameValue = CurName
End Sub

В цикле: Set NewEntry = New Entry NewEntry.Init"weeble", "bob" entity.Add NewEntry

Это может быть сделано непосредственно в вашем цикле или с помощью заводской функции, как сказал MarkJ.Обратите внимание, что после передачи в .Add вы можете повторно использовать эту переменную, если для нее задан новый экземпляр.

...