Algemene typen in Visual Basic (Visual Basic)
Een algemeen type is één programmeerelement dat wordt aangepast om dezelfde functionaliteit voor meerdere gegevenstypen uit te voeren. Wanneer u een algemene klasse of procedure definieert, hoeft u geen afzonderlijke versie te definiëren voor elk gegevenstype waarvoor u die functionaliteit mogelijk wilt uitvoeren.
Een analogie is een schroevendraaierset met verwijderbare hoofden. U inspecteert de schroef en selecteert de juiste kop voor die schroef (gekruist, uitgesterd). Zodra u de juiste kop in de schroevendraaier plaatst, voert u exact dezelfde functie uit met de schroevendraaier, namelijk het draaien van de schroef.
Wanneer u een algemeen type definieert, parameteriseert u dit met een of meer gegevenstypen. Met typeparameters kunt u code gebruiken om de gegevenstypen aan te passen aan de vereisten. Uw code kan verschillende programmeerelementen van het algemene element declareren, elk element dat op een andere set gegevenstypen werkt. Maar de gedeclareerde elementen voeren allemaal dezelfde logica uit, ongeacht welke gegevenstypen ze gebruiken.
U kunt bijvoorbeeld een wachtrijklasse maken en gebruiken die werkt op een specifiek gegevenstype, zoals String
. U kunt een dergelijke klasse uit System.Collections.Generic.Queue<T>declareren, zoals in het volgende voorbeeld wordt weergegeven.
Public stringQ As New System.Collections.Generic.Queue(Of String)
U kunt nu stringQ
gebruiken om uitsluitend te werken met String
waarden. Omdat stringQ
specifiek is voor String
in plaats van te worden gegeneraliseerd voor Object
waarden, hebt u geen late binding of typeconversie. Algemene typen besparen uitvoeringstijd en verminderen runtimefouten.
Zie How to: Use a Generic Classvoor meer informatie over het gebruik van een algemeen type.
Voorbeeld van een algemene klasse
In het volgende voorbeeld ziet u een basisdefinitie van een algemene klasse.
Public Class classHolder(Of t)
Public Sub processNewItem(ByVal newItem As t)
Dim tempItem As t
' Insert code that processes an item of data type t.
End Sub
End Class
In het voorgaande skelet is t
een typeparameter, dat wil zeggen, een tijdelijke aanduiding voor een gegevenstype dat u opgeeft wanneer u de klasse declareert. Elders in uw code kunt u verschillende versies van classHolder
declareren door verschillende gegevenstypen voor t
op te geven. In het volgende voorbeeld ziet u twee dergelijke declaraties.
Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)
De voorgaande instructies declareren samengestelde klassen, waarin een specifiek type de typeparameter vervangt. Deze vervanging wordt doorgegeven in de code binnen de samengestelde klasse. In het volgende voorbeeld ziet u hoe de processNewItem
procedure eruitziet in integerClass
.
Public Sub processNewItem(ByVal newItem As Integer)
Dim tempItem As Integer
' Inserted code now processes an Integer item.
End Sub
Zie Een klasse definiëren die identieke functionaliteit kan bieden voor verschillende gegevenstypenvoor een volledig voorbeeld.
In aanmerking komende programmeerelementen
U kunt algemene klassen, structuren, interfaces, procedures en gemachtigden definiëren en gebruiken. .NET definieert verschillende algemene klassen, structuren en interfaces die veelgebruikte algemene elementen vertegenwoordigen. De System.Collections.Generic naamruimte bevat woordenlijsten, lijsten, wachtrijen en stacks. Voordat u uw eigen algemene element definieert, controleert u of het al beschikbaar is in System.Collections.Generic.
Procedures zijn geen typen, maar u kunt algemene procedures definiëren en gebruiken. Zie Algemene procedures in Visual Basic.
Voordelen van algemene typen
Een algemeen type fungeert als basis voor het declareren van verschillende programmeerelementen, die elk op een specifiek gegevenstype werken. De alternatieven voor een algemeen type zijn:
- Eén type dat op het
Object
gegevenstype werkt. - Een collectie van typespecifieke versies van het type. Elke versie wordt afzonderlijk gecodeerd en wordt uitgevoerd op één specifiek gegevenstype, zoals
String
,Integer
of een door de gebruiker gedefinieerd type, zoalscustomer
.
Een algemeen type heeft de volgende voordelen ten opzichte van deze alternatieven:
- Typeveiligheid Algemene typen zorgen voor typecontrole tijdens compileertijd. Typen op basis van
Object
elk gegevenstype accepteren en u moet code schrijven om te controleren of een invoergegevenstype acceptabel is. Door generieke typen kan de compiler typecompatibiliteitsfouten opsporen voordat het programma wordt uitgevoerd. - Voorstelling. Algemene typen hoeven vak niet te en gegevens uit te schakelen, omdat elk type speciaal is voor één gegevenstype. Bewerkingen op basis van
Object
moeten invoergegevenstypen boxen om ze naarObject
te converteren en gegevens unboxen die bestemd zijn voor uitvoer. Boxing en unboxing verminderen de prestaties. Typen op basis vanObject
zijn ook laat gebonden, wat betekent dat het aanroepen van hun leden tijdens runtime extra code vereist. Typeconversies verminderen ook de prestaties. - Code-consolidatie. De code in een algemeen type moet slechts één keer worden gedefinieerd. Een set typespecifieke versies van een type moet in elke versie dezelfde code repliceren, waarbij het enige verschil het specifieke gegevenstype voor die versie is. Met algemene typen worden de typespecifieke versies allemaal gegenereerd op basis van het oorspronkelijke algemene type.
- Code hergebruiken. Code die niet afhankelijk is van een bepaald gegevenstype, kan opnieuw worden gebruikt met verschillende gegevenstypen als dit algemeen is. U kunt het vaak opnieuw gebruiken, zelfs met een gegevenstype dat u oorspronkelijk niet hebt voorspeld.
- IDE-ondersteuning. Wanneer u een samengesteld type gebruikt dat is gedeclareerd op basis van een algemeen type, kan de IDE (Integrated Development Environment) u meer ondersteuning bieden terwijl u uw code ontwikkelt. IntelliSense kan u bijvoorbeeld de typespecifieke opties voor een argument aan een constructor of methode laten zien.
- Algemene algoritmen. Abstracte algoritmen die typeonafhankelijk zijn, zijn goede kandidaten voor algemene typen. Een algemene procedure waarmee items worden gesorteerd met behulp van de IComparable-interface, kan bijvoorbeeld worden gebruikt met elk gegevenstype dat IComparableimplementeert.
Beperkingen
Hoewel de code in een algemene typedefinitie zo typeonafhankelijk moet zijn als mogelijk, moet u mogelijk een bepaalde mogelijkheid vereisen van elk gegevenstype dat aan uw algemene type wordt geleverd. Als u bijvoorbeeld twee items wilt vergelijken om te sorteren of samen te voegen, moet hun gegevenstype de IComparable-interface implementeren. U kunt deze vereiste afdwingen door een beperking toe te voegen aan de typeparameter.
Voorbeeld van een beperking
In het volgende voorbeeld ziet u een basisdefinitie van een klasse met een beperking waarvoor het typeargument is vereist om IComparablete implementeren.
Public Class itemManager(Of t As IComparable)
' Insert code that defines class members.
End Class
Als de volgende code probeert een klasse op te bouwen van itemManager
en een type opgeeft dat IComparableniet implementeert, geeft de compiler een foutmelding.
Typen beperkingen
Uw beperking kan de volgende vereisten opgeven in elke combinatie:
- Het typeargument moet een of meer interfaces implementeren
- Het typeargument moet van het type zijn of overnemen van maximaal één klasse.
- Het typeargument moet een parameterloze constructor beschikbaar maken die toegankelijk is voor de code waarmee objecten worden gemaakt
- Het typeargument moet een verwijzingstypeof een waardetype zijn.
C#-code kan aangeven dat een typeargument een onbeheerde typemoet zijn. Visual Basic dwingt deze beperking af voor Visual Basic-code die gebruikmaakt van een algemeen type of methode die is gedefinieerd met deze beperking (in C#). U kunt echter geen unmanaged
beperking declareren voor een typeparameter in Visual Basic.
Als u meer dan één vereiste moet opleggen, gebruikt u een door komma's gescheiden lijst met beperkingen tussen accolades ({ }
). Als u een toegankelijke constructor wilt vereisen, neemt u het New Operator trefwoord op in de lijst. Als u een verwijzingstype wilt vereisen, neemt u het Class
trefwoord op; als u een waardetype wilt vereisen, neemt u het Structure
trefwoord op.
Zie Lijst met typenvoor meer informatie over beperkingen.
Voorbeeld van meerdere beperkingen
In het volgende voorbeeld ziet u een basisdefinitie van een algemene klasse met een lijst met beperkingen voor de typeparameter. In de code waarmee een exemplaar van deze klasse wordt gemaakt, moet het typeargument zowel de IComparable- als IDisposable-interfaces implementeren, een verwijzingstype zijn en een toegankelijke constructor zonder parameter beschikbaar maken.
Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
' Insert code that defines class members.
End Class
Belangrijke termen
Algemene typen introduceren en gebruiken de volgende termen:
- Algemeen type. Een definitie van een klasse, structuur, interface, procedure of gemachtigde waarvoor u ten minste één gegevenstype opgeeft wanneer u deze declareert.
- Parametertype. In een algemene typedefinitie, een tijdelijke aanduiding voor een gegevenstype dat u opgeeft wanneer u het type declareert.
- Argumenttypen. Een specifiek gegevenstype dat een typeparameter vervangt wanneer u een samengesteld type declareert van een algemeen type.
- beperking. Een voorwaarde voor een typeparameter waarmee het typeargument wordt beperkt dat u hiervoor kunt opgeven. Een beperking kan vereisen dat het typeargument een bepaalde interface implementeert, overnemen van een bepaalde klasse, een toegankelijke parameterloze constructor heeft of een verwijzingstype of een waardetype is. U kunt deze beperkingen combineren, maar u kunt maximaal één basisklasse opgeven.
- samengesteld type. Een klasse, structuur, interface, procedure of gedelegeerde die is gedeclareerd vanuit een algemeen type door typeargumenten op te geven voor de typeparameters.