2014-11-03 18 views
7

Ich erstelle eine Immutable Linked List-Klasse in VBA. Es bietet ToArray und ToCollection Methoden, die ich beide als funktionierend verifiziert habe. Allerdings funktioniert die Get NewEnum() As IUnknown Eigenschaft nicht und ich weiß nicht warum.Kann keine neue Enumeration in VBA erstellen

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

    Set NewEnum = ToCollection.[_NewEnum] 

End Property 

Stepping durch den folgenden Code mit sequence als SList mit dem Debugger

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 

zeigt die For Each element In sequenceGet NewEnum Aufruf, der die Sammlung richtig baut und kehrt dann zu Copy und verlässt die Schleife, nachdem keine Iterationen durchführt und keine Fehler. Meine einzige Vermutung ist, dass NewEnum ist ein Iterator für eine Variable, die zerstört wird, wenn esverlässt. Ist das was passiert?

+2

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

Antwort

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

    Set NewEnum = ToCollection.[_NewEnum] 

End Property 

ToCollection ist eine neue Kollektion Rückkehr jedes Mal genannt; das würde wahrscheinlich funktionieren:

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 

... aber es ist eher hässlich. Idealerweise haben Sie eine Instanzstufe encapsulated As Collection, um den [_NewEnum]-Wert zurückzuliefern.

+0

Ist die statische Variable an die Instanz der Liste oder an die Definition der Klasse gebunden? EG, wenn ich über eine Liste schlinge, dann eine andere Liste erstelle und versuche, das zu überbrücken, würde ich am Ende über die erste Liste laufen? – cheezsteak

+0

Ich habe es nur 'Static' gemacht, weil Sie den Deklarationsabschnitt Ihrer Klasse nicht gezeigt haben - mein Eingeweide sagt mir, dass eine' Static'-Variable mit Methodenumfang dieselbe ist wie Instanzebene, aber ich könnte falsch liegen. Besser nicht "Static" Methodenbereichsvariablen und stattdessen ein privates Feld auf Instanzenebene verwenden. –

+0

Die wenigen Tests, die ich gemacht habe, haben gezeigt, dass es sich um Instanzen handelt – cheezsteak

Verwandte Themen