Share via


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

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

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

クラスに加え、ジェネリックの構造体、インターフェイス、プロシージャ、およびデリゲートを定義および使用できます。

型パラメーターを使ってクラスを定義するには

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

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

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

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

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

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

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

    制約を指定しない場合、コードで使用できる操作とメンバーは、オブジェクト型 (Object) でサポートされるものだけです。詳細については、「型リスト (Visual Basic)」を参照してください。

  5. 渡された型を使って宣言する各クラス メンバーを識別し、それを As typeparameter として宣言します。これは、内部ストレージ、プロシージャ パラメーター、および戻り値にも当てはまります。

  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 に渡される型引数として、Boolean または Double、構造体、列挙、任意の型のクラス (アプリケーションで独自に定義したクラスを含む) などの組み込みの型を使用できます。

    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
    

参照

処理手順

方法: ジェネリック クラスを使用する (Visual Basic)

関連項目

Of 句 (Visual Basic)

型リスト (Visual Basic)

オブジェクト型 (Object)

概念

Visual Basic におけるデータ型

Visual Basic におけるジェネリック型 (Visual Basic)

共通言語仕様