方法 : 複数のデータ型に同一の機能を提供できるクラスを定義する
更新 : 2007 年 11 月
複数のデータ型に同一の機能を提供するオブジェクトを作成するために使用できるクラスを定義できます。これを行うには、1 つ以上の型パラメータを定義内で指定します。このようなクラスは、さまざまなデータ型を使用するオブジェクトのテンプレートとして使用できます。この方法で定義したクラスは、ジェネリック クラスと呼ばれます。
ジェネリック クラスを定義すると、クラスを一度だけ定義すれば、コードの中でそれを使って、さまざまなデータ型を使用する多くのオブジェクトを作成できるようになります。それにより、クラスを Object 型で定義した場合よりパフォーマンスが向上します。
クラスに加え、ジェネリックの構造体、インターフェイス、プロシージャ、およびデリゲートを定義および使用できます。
型パラメータを使ってクラスを定義するには
通常の方法でクラスを定義します。
クラス名の直後に (Of typeparameter) を追加し、型パラメータを指定します。
複数の型パラメータがある場合は、コンマで区切られたリストを作成し、かっこで囲みます。Of キーワードは繰り返さないでください。
型パラメータに対して単純な代入以外の操作を実行する場合は、その型パラメータの後に As 句を付けて 1 つ以上の制約を追加します。制約は、その型パラメータに渡される型が以下のような要件を満たすことを保証します。
コードで実行する > などの操作をサポートする
コードでアクセスするメソッドなどのメンバをサポートする
パラメータなしのコンストラクタを公開する
制約を指定しない場合、コードで使用できる操作とメンバは、オブジェクト型 (Object) でサポートされるものだけです。詳細については、「型リスト」を参照してください。
渡された型を使って宣言する各クラス メンバを識別し、それを As typeparameter として宣言します。これは、内部ストレージ、プロシージャ パラメータ、および戻り値にも当てはまります。
コードでは、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