2

次のような単純なクラスList.vbがあります。

Public Class List

    Public fList As List(Of Integer)
    Public Sub New()
        fList = New List(Of Integer)
        fList.Add(1)
        fList.Add(2)
        fList.Add(3)
        fList.Add(4)
        fList.Add(5)
    End Sub
End Class

Consoleアプリケーションは、次のようにこのクラスを使用しています。

Module Module1

    Sub Main()

        Dim fObject As List = New List
        Dim cnt As Integer = 0
        For Each x As Integer In fObject.fList
            Console.WriteLine("hello; {0}", fObject.fList.Item(cnt).ToString())
            cnt = cnt + 1
        Next

        Console.WriteLine("press [enter] to exit")
        Console.Read()

    End Sub

End Module

List.vb が (整数の) リスト型になるようにクラス コードを変更できますか?
これは、コンソール コードIn fObject.fListで単にIn fObject?に置き換えることができることを意味します。
それとも、間違ったツリーを鳴らしていますか? クラスは単一のオブジェクトであり、リストはクラスのコレクションであるべきですか?

4

2 に答える 2

1

はい、できます。オブジェクトが と互換性を持つためには、次の機能For Eachが必要です。GetEnumerator

Public Function GetEnumerator() As IEnumerator _
  Implements IEnumerable.GetEnumerator
    Return New IntListEnum(fList)
End Function

IntListEnumクラスは、次のように を実装する必要がありますIEnumerator

Public Class IntListEnum Implements IEnumerator

Private listInt As List(Of Integer)

Dim position As Integer = -1

Public Sub New(ByVal fList As List(Of Integer))
    listInt = fList
End Sub 

Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
    position = position + 1
    Return (position < listInt.Count)
End Function 

Public Sub Reset() Implements IEnumerator.Reset
    position = -1
End Sub 

Public ReadOnly Property Current() As Object Implements IEnumerator.Current
    Get 
        Try 
            Return listInt(position)
        Catch ex As IndexOutOfRangeException
            Throw New InvalidOperationException()
        End Try 
    End Get 
End Property 

クラス終了

fListこれで、非公開にしてList、次のように繰り返すことができます。

For Each x As Integer In fObject

ここで完全な例を見ることができます。

于 2012-12-08T12:14:55.957 に答える
0

dasblinkenlightが提供した答えは優れていますが、必要なのが事前に入力された整数のリストだけである場合はList(Of Integer)、コンストラクターから継承してクラスを作成することができます。

Public Class List
    Inherits List(Of Integer)

    Public Sub New()
        Add(1)
        Add(2)
        Add(3)
        Add(4)
        Add(5)
    End Sub
End Class

から継承するList(Of Integer)と、クラスはそのタイプによって実装されたすべての機能を自動的に取得するため、クラスも同じように機能するリストクラスになります。次に、次のように使用できます。

Dim fObject As New List()
For Each x As Integer In fObject
    Console.WriteLine("hello; {0}", x)
Next
于 2012-12-08T16:40:23.073 に答える