Comment : définir une classe qui fournisse des fonctionnalités identiques pour différents types de données (Visual Basic)
Vous pouvez définir une classe à partir de laquelle vous créez des objets qui fournissent les mêmes fonctions pour des types de données différents. Pour cela, vous spécifiez un ou plusieurs paramètres de type dans la définition. La classe peut ensuite servir de modèle pour les objets qui utilisent différents types de données. Une classe définie de cette façon est appelée classe générique.
L’avantage de définir une classe générique est que vous la définissez une seule fois. Votre code peut ensuite l’utiliser pour créer divers objets qui utilisent différents types de données. Cette approche offre de meilleures performances que la définition d’une classe avec le type Object
.
En plus des classes, vous pouvez définir et utiliser des structures, interfaces, procédures et délégués génériques.
Pour définir une classe avec un paramètre de type
Définissez la classe comme vous le faites habituellement.
Ajoutez le typeparameter
)
(Of
juste après le nom de classe pour spécifier un paramètre de type.Si vous utilisez plusieurs paramètres de type, spécifiez-les dans une liste séparée par des virgules et mise entre parenthèses. Ne répétez pas le mot clé
Of
.Si votre code effectue des opérations sur un paramètre de type autre qu’une simple assignation, faites suivre ce paramètre de type d’une clause
As
pour ajouter une ou plusieurs contraintes. Une contrainte garantit que le type fourni pour ce paramètre de type remplit une exigence similaire aux exigences suivantes :Prend en charge une opération, par exemple
>
, que votre code exécute.Prend en charge un membre, tel qu’une méthode, auquel votre code accède.
Expose un constructeur sans paramètre.
Si vous ne spécifiez pas de contraintes, votre code peut utiliser uniquement les opérations et membres qui sont pris en charge par Object Data Type. Pour plus d'informations, consultez Type List.
Identifiez chaque membre de classe qui doit être déclaré avec un type fourni et déclarez-le
As
typeparameter
. Cela s’applique au stockage interne, aux paramètres de procédure et aux valeurs renvoyées.Vérifiez que votre code utilise uniquement des opérations et des méthodes qui sont prises en charge par tous les types de données qu’il peut fournir à
itemType
.L’exemple suivant définit une classe qui gère une liste très simple. Cette liste est contenue dans le tableau interne
items
. Le code utilisé peut déclarer le type de données des éléments de la liste. Un constructeur paramétrable permet au code utilisé de définir la limite supérieure deitems
, et le constructeur sans paramètre définit cette limite à 9 (sur un total de 10 éléments).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
Vous pouvez déclarer une classe à partir de
simpleList
pour contenir une liste de valeursInteger
, une deuxième classe pour contenir une liste de valeursString
et une troisième classe pour contenir des valeursDate
. À l’exception du type de données des membres de la liste, les objets créés à partir de toutes ces classes ont un comportement identique.L’argument de type que le code utilisé fournit à
itemType
peut être un type intrinsèque tel queBoolean
ouDouble
, une structure, une énumération ou un type de classe, y compris l’un des types de classe définis par votre application.Vous pouvez tester la classe
simpleList
à l’aide du code suivant.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