方法: 複数のデータ型に同一の機能を提供できるクラスを定義する (Visual Basic)

複数の異なるデータ型に同一の機能を提供するオブジェクトを作成するために使用できるクラスを定義できます。 これを行うには、1 つ以上の 型パラメーター を定義内で指定します。 このようなクラスは、さまざまなデータ型を使用するオブジェクトのテンプレートとして使用できます。 この方法で定義したクラスは、 ジェネリック クラスと呼ばれます。

ジェネリック クラスを定義する利点は、クラスを一度だけ定義すれば、コードの中でそれを使って、さまざまなデータ型を使用する多くのオブジェクトを作成できることです。 これにより、クラスを Object 型で定義した場合よりパフォーマンスが向上します。

クラスに加えて、ジェネリックの構造体、インターフェイス、プロシージャ、デリゲートを定義して利用することもできます。

型パラメーターを持つクラスを定義するには

  1. 通常の方法でクラスを定義します。

  2. クラス名の直後に (Oftypeparameter) を追加し、型パラメーターを指定します。

  3. 複数の型パラメーターがある場合は、かっこ内にコンマ区切りのリストを指定します。 Of キーワードは繰り返さないでください。

  4. 型パラメーターに対して単純な代入以外の操作を実行する場合は、その型パラメーターの後に As 句を付けて 1 つ以上の 制約を追加します。 制約は、その型パラメーターに渡される型が、たとえば以下のような要件を満たすことを保証します。

    • コードで実行する >などの演算をサポートする

    • コードでアクセスするメソッドなどのメンバーをサポートする

    • パラメーターなしのコンストラクターを公開する

    制約を指定しない場合、コードで使用できる演算とメンバーは、 Object Data Typeでサポートされるものだけになります。 詳細については、「Type List」を参照してください。

  5. 渡された型を使って宣言する必要のある各クラス メンバーを識別し、それを Astypeparameterとして宣言します。 これは、内部ストレージ、プロシージャのパラメーター、戻り値に適用されます。

  6. コードでは、 itemTypeに渡される可能性があるすべてのデータ型でサポートされる演算とメソッドだけを使用します。

    次のコード例は、ごく単純なリストを管理するクラスを定義しています。 このクラスは、リストを内部配列 itemsに格納します。このクラスを使用するコードでは、このリストの要素のデータ型を宣言できます。 パラメーター化されたコンストラクターを使うと、コードで items の上限を設定できます。パラメーターなしのコンストラクターでは、この上限は 9 (合計で 10 項目) に設定されます。

    Public Class simpleList(Of itemType)
      Private items() As itemType
      Private top As Integer
      Private nextp As Integer
      Public Sub New()
        Me.New(9)
      End Sub
      Public Sub New(ByVal t As Integer)
        MyBase.New()
        items = New itemType(t) {}
        top = t
        nextp = 0
      End Sub
      Public Sub add(ByVal i As itemType)
        insert(i, nextp)
      End Sub
      Public Sub insert(ByVal i As itemType, ByVal p As Integer)
        If p > nextp OrElse p < 0 Then
          Throw New System.ArgumentOutOfRangeException("p", 
            " less than 0 or beyond next available list position")
        ElseIf nextp > top Then
          Throw New System.ArgumentException("No room to insert at ", 
            "p")
        ElseIf p < nextp Then
          For j As Integer = nextp To p + 1 Step -1
            items(j) = items(j - 1)
          Next j
        End If
        items(p) = i
        nextp += 1
      End Sub
      Public Sub remove(ByVal p As Integer)
        If p >= nextp OrElse p < 0 Then
            Throw New System.ArgumentOutOfRangeException("p", 
                " less than 0 or beyond last list item")
        ElseIf nextp = 0 Then
            Throw New System.ArgumentException("List empty; cannot remove ", 
                "p")
        ElseIf p < nextp - 1 Then
            For j As Integer = p To nextp - 2
                items(j) = items(j + 1)
            Next j
        End If
        nextp -= 1
      End Sub
      Public ReadOnly Property listLength() As Integer
        Get
          Return nextp
        End Get
      End Property
      Public ReadOnly Property listItem(ByVal p As Integer) As itemType
        Get
          If p >= nextp OrElse p < 0 Then
            Throw New System.ArgumentOutOfRangeException("p", 
              " less than 0 or beyond last list item")
            End If
          Return items(p)
        End Get
      End Property
    End Class
    

    simpleList からは、 Integer 値のリストを格納するクラス、 String 値のリストを格納するクラス、 Date 値のリストを格納するクラスなどを宣言できます。 リスト メンバーのデータ型が異なるだけで、これらすべてのクラスから作成されるオブジェクトの動作はまったく同じです。

    使用するコードから itemType に渡す型引数としては、 BooleanDoubleなどの組み込みの型、構造体、列挙、任意の型のクラス (アプリケーションで独自に定義したクラスを含む) を使用できます。

    simpleList クラスをテストするには、次のコードを使用します。

    Public Sub useSimpleList()
      Dim iList As New simpleList(Of Integer)(2)
      Dim sList As New simpleList(Of String)(3)
      Dim dList As New simpleList(Of Date)(2)
      iList.add(10)
      iList.add(20)
      iList.add(30)
      sList.add("First")
      sList.add("extra")
      sList.add("Second")
      sList.add("Third")
      sList.remove(1)
      dList.add(#1/1/2003#)
      dList.add(#3/3/2003#)
      dList.insert(#2/2/2003#, 1)
      Dim s = 
        "Simple list of 3 Integer items (reported length " &
         CStr(iList.listLength) & "):" &
         vbCrLf & CStr(iList.listItem(0)) &
         vbCrLf & CStr(iList.listItem(1)) &
         vbCrLf & CStr(iList.listItem(2)) &
         vbCrLf &
         "Simple list of 4 - 1 String items (reported length " &
         CStr(sList.listLength) & "):" &
         vbCrLf & CStr(sList.listItem(0)) &
         vbCrLf & CStr(sList.listItem(1)) &
         vbCrLf & CStr(sList.listItem(2)) &
         vbCrLf &
         "Simple list of 2 + 1 Date items (reported length " &
         CStr(dList.listLength) & "):" &
         vbCrLf & CStr(dList.listItem(0)) &
         vbCrLf & CStr(dList.listItem(1)) &
         vbCrLf & CStr(dList.listItem(2))
      MsgBox(s)
    End Sub
    

関連項目