ちょっと生きづらさを抱えた人へ、気持ちを楽にするためのお手紙です。

【VBA】Iteratorパターンのコピペ用の枠セット

 

Option Explicit

Public Function hasNext() As Boolean

End Function

Public Function nextItem() As Object

End Function
Option Explicit

Public Function iterator() As IIterator
    
End Function
Option Explicit

Private this_id As String    ' ID
Private this_name As String  ' 名前

'-------------------------------------------------------------------------------
' 【関 数 名】コンストラクタ
' 【処理概要】初期化を行う
' 【引    数】なし
' 【戻 り 値】なし
'-------------------------------------------------------------------------------
Private Sub Class_Initialize()

End Sub

'-------------------------------------------------------------------------------
' 【関 数 名】デストラクタ
' 【処理概要】終期化を行う
' 【引    数】なし
' 【戻 り 値】なし
'-------------------------------------------------------------------------------
Private Sub Class_Terminate()

End Sub

'-------------------------------------------------------------------------------
' 【getter・setter】ID
'-------------------------------------------------------------------------------
Public Property Get id() As String
    id = this_id
End Property

Public Property Let id(ByVal value As String)
    this_id = value
End Property

'-------------------------------------------------------------------------------
' 【getter・setter】名前
'-------------------------------------------------------------------------------
Public Property Get name() As String
    name = this_name
End Property

Public Property Let name(ByVal value As String)
    this_name = value
End Property

'-------------------------------------------------------------------------------
' 【関 数 名】初期化
' 【処理概要】初期化を行う
' 【引    数】[I]ByVal id As String
'           [I]ByVal name As String
' 【戻 り 値】なし
'-------------------------------------------------------------------------------
Public Sub init(ByVal id As String, ByVal name As String)
    Me.id = id
    Me.name = name
End Sub
Option Explicit

Implements IIterator

Private baseAggr As New BaseAggregate
Private index As Long

'-------------------------------------------------------------------------------
' 【関 数 名】次要素有無判定
' 【処理概要】次の要素があるか判定する
' 【引    数】なし
' 【戻 り 値】True  次要素あり
'           False 次要素なし
'-------------------------------------------------------------------------------
Public Function IIterator_hasNext() As Boolean
    If index <= baseAggr.getCount Then
        IIterator_hasNext = True
    Else
        IIterator_hasNext = False
    End If
End Function

'-------------------------------------------------------------------------------
' 【関 数 名】次要素取得
' 【処理概要】次の要素を取得する
' 【引    数】なし
' 【戻 り 値】次要素あり
'-------------------------------------------------------------------------------
Public Function IIterator_nextItem() As Object
    Set IIterator_nextItem = baseAggr.getItem(index)
    index = index + 1
End Function

'-------------------------------------------------------------------------------
' 【関 数 名】初期化
' 【処理概要】初期化を行う
' 【引    数】[I]ByVal BaseAggregate As IAggregate 集合体
' 【戻 り 値】なし
'-------------------------------------------------------------------------------
Public Sub init(ByVal BaseAggregate As IAggregate)
    Set baseAggr = BaseAggregate
    index = 1
End Sub
Option Explicit

Implements IAggregate

Private items As New Collection

'-------------------------------------------------------------------------------
' 【関 数 名】コンストラクタ
' 【処理概要】初期化を行う
' 【引    数】なし
' 【戻 り 値】なし
'-------------------------------------------------------------------------------
Private Sub Class_Initialize()
    Call addItem("0", "なまえ0")
    Call addItem("1", "なまえ1")
End Sub

'-------------------------------------------------------------------------------
' 【関 数 名】デストラクタ
' 【処理概要】終期化を行う
' 【引    数】なし
' 【戻 り 値】なし
'-------------------------------------------------------------------------------
Private Sub Class_Terminate()
End Sub

'-------------------------------------------------------------------------------
' 【関 数 名】イテレータ
' 【処理概要】イテレータ
' 【引    数】なし
' 【戻 り 値】イテレータ
'-------------------------------------------------------------------------------
Public Function IAggregate_iterator() As IIterator
    Dim res As New BaseBeanIterator
    
    Call res.init(Me)
    Set IAggregate_iterator = res
End Function

'-------------------------------------------------------------------------------
' 【関 数 名】要素数取得
' 【処理概要】要素数を取得する
' 【引    数】なし
' 【戻 り 値】要素数
'-------------------------------------------------------------------------------
Public Function getCount() As Integer
    getCount = items.Count
End Function

'-------------------------------------------------------------------------------
' 【関 数 名】要素取得
' 【処理概要】要素を取得する
' 【引    数】[I]ByVal index As Integer 要素インデックス
' 【戻 り 値】要素
'-------------------------------------------------------------------------------
Public Function getItem(ByVal index As Integer) As BaseBean
    Set getItem = items.Item(index)
End Function

'-------------------------------------------------------------------------------
' 【関 数 名】要素追加
' 【処理概要】要素を設定する
' 【引    数】なし
' 【戻 り 値】なし
'-------------------------------------------------------------------------------
Private Sub addItem(ByVal id As String, ByVal name As String)
    Dim bean As New BaseBean
    
    Call bean.init(id, name)
    items.Add Item:=bean
End Sub
Public Sub test()
    Dim beanAggr As New BaseAggregate
    Dim bean As New BaseBean
    Dim it As New IIterator
    
    Set it = beanAggr.IAggregate_iterator
    
    Do While (it.hasNext)
        Set bean = it.nextItem
        Debug.Print bean.id
        Debug.Print bean.name
    Loop
    Set bean = Nothing
    Set it = Nothing
End Sub

コメントを残す

メールアドレスが公開されることはありません。