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