Algemene typen in Visual Basic (Visual Basic)
Een algemeen type is één programmeerelement dat wordt aangepast om dezelfde functionaliteit uit te voeren voor verschillende gegevenstypen. 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 die u moet draaien en selecteert de juiste kop voor die schroef (gekruist, uitgehongerd). 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. Hierdoor kan het gebruik van code de gegevenstypen aanpassen 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 declareren van System.Collections.Generic.Queue<T>, zoals in het volgende voorbeeld wordt weergegeven.
Public stringQ As New System.Collections.Generic.Queue(Of String)
U kunt nu stringQ
uitsluitend met String
waarden werken. Omdat stringQ
dit specifiek is voor String
in plaats van gegeneraliseerd te worden voor Object
waarden, hebt u geen late binding of typeconversie. Dit bespaart uitvoeringstijd en vermindert runtimefouten.
Zie Een algemene klasse gebruiken voor 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 t
is 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 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, waarbij 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 gegevenstypen voor een volledig voorbeeld.
In aanmerking komende programmeerelementen
U kunt algemene klassen, structuren, interfaces, procedures en gemachtigden definiëren en gebruiken. Het .NET Framework definieert verschillende algemene klassen, structuren en interfaces die veelgebruikte algemene elementen vertegenwoordigen. De System.Collections.Generic naamruimte bevat woordenlijsten, lijsten, wachtrijen en stapels. 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 wordt uitgevoerd.Een set typespecifieke versies van het type, elke versie 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:
Type Veiligheid. Algemene typen dwingen controle van het type compileertijd af. Typen op
Object
basis van het accepteren van een gegevenstype en u moet code schrijven om te controleren of een invoergegevenstype acceptabel is. Met algemene typen kan de compiler type niet overeenkomen voordat de runtime wordt uitgevoerd.Prestaties. Algemene typen hoeven geen gegevens te gebruiken en uit te schakelen, omdat elk type speciaal is voor één gegevenstype. Bewerkingen op
Object
basis van invoergegevenstypen moeten boxinvoergegevens bevatten om ze te converteren naarObject
en gegevens uit te schakelen die bestemd zijn voor uitvoer. Boksen en uitpakken vermindert de prestaties.Typen op
Object
basis van zijn ook te laat gebonden, wat betekent dat voor toegang tot hun leden tijdens runtime extra code is vereist. Dit vermindert ook de prestaties.Codeconsolidatie. 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 worden hergebruikt 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 wordt geïmplementeerd IComparable.
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 voor het sorteren of sorteren, moet het bijbehorende 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 moet worden geïmplementeerd IComparable.
Public Class itemManager(Of t As IComparable)
' Insert code that defines class members.
End Class
Als de volgende code probeert een klasse te maken van het leveren van itemManager
een type dat niet wordt geïmplementeerd IComparable, geeft de compiler een fout aan.
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 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 verwijzingstype zijn of moet een waardetype zijn
Als u meer dan één vereiste moet opleggen, gebruikt u een lijst met door komma's gescheiden beperkingen binnen accolades ({ }
). Als u een toegankelijke constructor wilt vereisen, neemt u het trefwoord Nieuwe operator 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 typen voor 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 als de IComparableIDisposable interfaces implementeren, een verwijzingstype zijn en een toegankelijke parameterloze constructor 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.
Typ parameter. In een algemene typedefinitie, een tijdelijke aanduiding voor een gegevenstype dat u opgeeft wanneer u het type declareert.
Typ argument. 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 moet implementeren, een bepaalde interface moet implementeren of overnemen van een bepaalde klasse, een toegankelijke parameterloze constructor moet hebben of een verwijzingstype of een waardetype moet zijn. U kunt deze beperkingen combineren, maar u kunt maximaal één klasse opgeven.
Samengesteld type. Een klasse, structuur, interface, procedure of gemachtigde die is gedeclareerd van een algemeen type door typeargumenten op te geven voor de typeparameters.