2014-11-03 28 views
7

我正在VBA中創建一個不可變鏈接列表類。它提供ToArrayToCollection方法,我已經驗證了這兩個方法的正常工作。但Get NewEnum() As IUnknown屬性不起作用,我不知道爲什麼。無法在VBA中創建新的枚舉

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

    Set NewEnum = ToCollection.[_NewEnum] 

End Property 

通過下面的代碼與sequence步進作爲SList與調試器

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 

顯示For Each element In sequence主叫Get NewEnum其正確構建的收集和然後返回到Copy和不執行迭代之後退出循環並沒有錯誤。我唯一的猜測是NewEnum是一個變量的迭代器,它在退出Get NewEnum時被銷燬。 這是怎麼回事?

+2

http://chat.stackexchange.com/transcript/message/18457890#18457890 – RubberDuck 2014-11-03 19:22:43

回答

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

    Set NewEnum = ToCollection.[_NewEnum] 

End Property 

ToCollection每次調用時都會返回一個新的集合;這可能會工作:

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 

...但它是相當醜陋。理想情況下,您需要一些實例級別的encapsulated As Collection以返回[_NewEnum]的值。

+0

靜態變量是綁定到List的實例還是綁定到類的定義? EG如果我循環一個列表,然後創建另一個列表並嘗試循環,那麼我最終會循環第一個列表? – cheezsteak 2014-11-03 20:07:40

+0

因爲你沒有顯示你的類的聲明部分,所以我只使它成爲'Static' - 我的膽量告訴我一個方法範圍的'Static'變量與實例級別相同,但我可能是錯的。最好不要使用'Static'方法範圍的變量,而是在實例級別使用私有字段。 – 2014-11-03 20:10:13

+0

我做的幾個測試顯示它是實例級別 – cheezsteak 2014-11-03 21:42:07