Cómo: Definir una clase que pueda proporcionar la misma funcionalidad en tipos de datos diferentes (Visual Basic)
Puede definir una clase desde la que se puedan crear objetos que proporcionen una funcionalidad idéntica en tipos de datos diferentes. Para ello, especifique uno o más parámetros de tipo en la definición. Posteriormente, la clase puede servir de plantilla para los objetos que usan distintos tipos de datos. Una clase definida de esta manera se denomina clase genérica.
La ventaja de definir una clase genérica es que se define una sola vez y, después, el código puede usarla para crear muchos objetos que emplean una gran variedad de tipos de datos. El resultado es rendimiento mayor que al definir la clase con el tipo Object
.
Además de clases, también puede definir y usar estructuras genéricas, interfaces, procedimientos y delegados.
Para definir una clase con un parámetro de tipo
Defina la clase de la manera normal.
Agregue
(Of
typeparameter)
inmediatamente después del nombre de clase para especificar un parámetro de tipo.Si tiene más de un parámetro de tipo, realice una lista separada por comas entre paréntesis. No repita la palabra clave
Of
.Si el código realiza operaciones en un parámetro de tipo distintas de la asignación simple, siga ese parámetro de tipo con una cláusula
As
para agregar una o más restricciones. Una restricción garantiza que el tipo proporcionado para ese parámetro de tipo satisfaga un requisito como el siguiente:Admitir una operación, como
>
, que realice el código.Admita a un miembro, como un método, al que accede el código.
Exponer un constructor sin parámetros.
Si no especifica ninguna restricción, las únicas operaciones y miembros que el código podrá usar son las que admite el Object Data Type. Para obtener más información, consulta Type List.
Identifique cada miembro de clase que deba declararse con un tipo suministrado y declárelo
As
typeparameter
. Esto se aplica al almacenamiento interno, los parámetros de procedimiento y los valores devueltos.Asegúrese de que el código solo usa operaciones y métodos admitidos por cualquier tipo de datos que pueda proporcionar a
itemType
.En el ejemplo siguiente se define una clase que administra una lista muy simple. Contiene la lista de la matriz interna
items
y el código que la usa puede declarar el tipo de datos de los elementos de la lista. Un constructor con parámetros permite que el código using establezca el límite superior deitems
, y el constructor sin parámetros lo establece en 9 (para un total de diez elementos).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
Puede declarar una clase de
simpleList
para que contenga una lista de valoresInteger
, otra para que contenga una lista de valoresString
y otra para que contenga valoresDate
. Excepto para el tipo de datos de los miembros de la lista, los objetos creados a partir de todas estas clases se comportan exactamente igual.El argumento de tipo que el código que lo usa proporciona a
itemType
puede ser un tipo intrínseco comoBoolean
oDouble
, una estructura, una enumeración o cualquier tipo de clase, incluida una que defina la aplicación.Puede probar la clase
simpleList
con el siguiente código.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