2014-11-03 27 views
7

Tworzę klasę VLT w języku Immutable Linked List. Dostarcza metod, które zarówno sprawdziłem jako działające. Jednak właściwość Get NewEnum() As IUnknown nie działa i nie wiem dlaczego.Nie można utworzyć nowej enum w VBA

Public Property Get NewEnum() As IUnknown 
Attribute NewEnum.VB_UserMemId = -4 

    Set NewEnum = ToCollection.[_NewEnum] 

End Property 

Krocząc przez następujący kod z sequence jako SList z debuggera

Public Function Copy(ByVal sequence As Variant) As SList 

    Dim made As New SList 

    Dim element As Variant 
    For Each element In sequence 
     Set made = made.Cons(element) 
    Next 

    Set Copy = made.Reverse 

End Function 

pokazuje For Each element In sequence nazywając Get NewEnum która buduje kolekcję prawidłowo, a następnie powraca do Copy i wyjście z pętli po wykonaniu bez powtórzeń i bez błędów. Przypuszczam tylko, że NewEnum jest iteratorem zmiennej, która jest niszczona, gdy kończy się Get NewEnum. Czy to się dzieje?

+2

http://chat.stackexchange.com/transcript/message/18457890#18457890 – RubberDuck

Odpowiedz

6
Public Property Get NewEnum() As IUnknown 
Attribute NewEnum.VB_UserMemId = -4 

    Set NewEnum = ToCollection.[_NewEnum] 

End Property 

ToCollection powraca nową kolekcję za każdym razem to się nazywa; to prawdopodobnie zadziała:

Public Property Get NewEnum() As IUnknown 
Attribute NewEnum.VB_UserMemId = -4 

    Static internalCollection As Collection 
    If internalCollection Is Nothing Then Set internalCollection = ToCollection 

    Set NewEnum = internalCollection.[_NewEnum] 

End Property 

... ale jest dość brzydka. Idealnie byłoby mieć pewną instancję na poziomie encapsulated As Collection, która zwróci wartość [_NewEnum].

+0

Czy zmienna statyczna jest powiązana z instancją Listy lub z definicją klasy? EG jeśli przerzucę jedną listę, a następnie utworzę kolejną listę i spróbuję zapętlić się nad tym, czy skończy się pętla nad pierwszą? – cheezsteak

+0

Stworzyłem tylko 'Static', ponieważ nie pokazałeś sekcji deklaracji twojej klasy - moje flaki mówią mi, że zmienna' Static' o zakresie metod jest taka sama jak poziom instancji, ale mogę się mylić. Lepiej nie stosować zmiennych o zakresie "statycznym" i używać zamiast tego prywatnego pola na poziomie instancji. –

+0

Kilka testów, które zrobiłem pokazało, że jest to poziom instancji – cheezsteak

Powiązane problemy