Share via


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

更新 : 2007 年 11 月

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

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

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

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

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

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

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

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

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

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

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

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

  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 As String = _
        "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 におけるデータ型

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

共通言語仕様

参照

Of

型リスト

オブジェクト型 (Object)