Objecten en klassen in Visual Basic
Een object is een combinatie van code en gegevens die kunnen worden behandeld als een eenheid. Een object kan een deel van een toepassing zijn, zoals een besturingselement of een formulier. Een hele toepassing kan ook een object zijn.
Wanneer u een toepassing in Visual Basic maakt, werkt u voortdurend met objecten. U kunt objecten van Visual Basic gebruiken, zoals besturingselementen, formulieren en gegevenstoegangsobjecten. U kunt ook objecten uit andere toepassingen in uw Visual Basic toepassing gebruiken. U kunt zelfs uw eigen objecten maken en aanvullende eigenschappen en methoden voor deze objecten definiëren. Objecten fungeren als geprefabriceerde bouwstenen voor programma's. Hiermee kunt u één keer code schrijven en deze opnieuw gebruiken.
In dit onderwerp worden objecten in detail besproken.
Objecten en klassen
Elk object in Visual Basic wordt gedefinieerd door een klasse. Een klasse beschrijft de variabelen, eigenschappen, procedures en gebeurtenissen van een object. Objecten zijn exemplaren van klassen; u kunt zoveel objecten maken die u nodig hebt nadat u een klasse hebt gedefinieerd.
Als u de relatie tussen een object en de klasse wilt begrijpen, kunt u cookies en cookies beschouwen. De koekjesnijder is de klasse. Het definieert de kenmerken van elke cookie, bijvoorbeeld grootte en vorm. De klasse wordt gebruikt om objecten te maken. De objecten zijn de cookies.
U moet een object maken voordat u toegang hebt tot de leden, met uitzondering van Shared
leden die toegankelijk zijn zonder een object van de klasse.
Een object maken op basis van een klasse
Bepaal op basis van welke klasse u een object wilt maken of definieer uw eigen klasse. Bijvoorbeeld:
Public Class Customer Public Property AccountNumber As Integer End Class
Schrijf een Dim-instructie om een variabele te maken waaraan u een klasse-exemplaar kunt toewijzen. De variabele moet van het type van de gewenste klasse zijn.
Dim nextCustomer As Customer
Voeg het trefwoord Nieuwe operator toe om de variabele te initialiseren in een nieuw exemplaar van de klasse.
Dim nextCustomer As New Customer
U hebt nu toegang tot de leden van de klasse via de objectvariabele.
nextCustomer.AccountNumber = lastAccountNumber + 1
Notitie
Indien mogelijk moet u declareren dat de variabele van het klassetype is dat u eraan wilt toewijzen. Dit wordt vroege binding genoemd. Als u het klassetype tijdens het compileren niet weet, kunt u late binding aanroepen door de variabele te declareren voor het gegevenstype Object. Late binding kan echter de prestaties langzamer maken en de toegang tot de leden van het runtime-object beperken. Zie Objectvariabeledeclaratie voor meer informatie.
Meerdere exemplaren
Objecten die nieuw zijn gemaakt op basis van een klasse, zijn vaak identiek aan elkaar. Zodra ze bestaan als afzonderlijke objecten, kunnen hun variabelen en eigenschappen echter onafhankelijk van de andere exemplaren worden gewijzigd. Als u bijvoorbeeld drie selectievakjes aan een formulier toevoegt, is elk selectievakjeobject een exemplaar van de CheckBox klasse. De afzonderlijke CheckBox objecten delen een gemeenschappelijke set kenmerken en mogelijkheden (eigenschappen, variabelen, procedures en gebeurtenissen) die door de klasse zijn gedefinieerd. Elk heeft echter een eigen naam, kan afzonderlijk worden ingeschakeld en uitgeschakeld en kan op een andere locatie op het formulier worden geplaatst.
Objectleden
Een object is een element van een toepassing, dat een exemplaar van een klasse vertegenwoordigt. Velden, eigenschappen, methoden en gebeurtenissen zijn de bouwstenen van objecten en vormen hun leden.
Toegang tot leden
U opent een lid van een object door in de volgorde de naam van de objectvariabele, een punt (.
) en de naam van het lid op te geven. In het volgende voorbeeld wordt de Text eigenschap van een Label object ingesteld.
warningLabel.Text = "Data not saved"
IntelliSense-vermelding van leden
IntelliSense bevat leden van een klas wanneer u de optie Leden van de lijst aanroept, bijvoorbeeld wanneer u een punt (.
) typt als operator voor lidtoegang. Als u de periode typt na de naam van een variabele die is gedeclareerd als een exemplaar van die klasse, geeft IntelliSense alle leden van het exemplaar en geen van de gedeelde leden weer. Als u de periode na de klassenaam zelf typt, worden intelliSense alle gedeelde leden en geen van de leden van het exemplaar vermeld. Zie IntelliSense gebruiken voor meer informatie.
Velden en eigenschappen
Velden en eigenschappen vertegenwoordigen informatie die is opgeslagen in een object. U haalt de waarden op en stelt deze in met toewijzingsinstructies op dezelfde manier als u lokale variabelen in een procedure ophaalt en instelt. In het volgende voorbeeld wordt de Width eigenschap opgehaald en de ForeColor eigenschap van een Label object ingesteld.
Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red
Houd er rekening mee dat een veld ook wel een lidvariabele wordt genoemd.
Gebruik eigenschapsprocedures wanneer:
U moet bepalen wanneer en hoe een waarde wordt ingesteld of opgehaald.
De eigenschap heeft een goed gedefinieerde set waarden die moeten worden gevalideerd.
Het instellen van de waarde veroorzaakt een zekere wijziging in de status van het object, zoals een
IsVisible
eigenschap.Als u de eigenschap instelt, worden wijzigingen in andere interne variabelen of de waarden van andere eigenschappen veroorzaakt.
Er moet een set stappen worden uitgevoerd voordat de eigenschap kan worden ingesteld of opgehaald.
Velden gebruiken wanneer:
De waarde is van een zelfvalidatietype. Een fout of automatische gegevensconversie treedt bijvoorbeeld op als een andere waarde dan
True
ofFalse
is toegewezen aan eenBoolean
variabele.Elke waarde in het bereik dat wordt ondersteund door het gegevenstype, is geldig. Dit geldt voor veel eigenschappen van het type
Single
ofDouble
.De eigenschap is een
String
gegevenstype en er is geen beperking voor de grootte of waarde van de tekenreeks.Zie Eigenschapsprocedures voor meer informatie.
Tip
Houd altijd de niet-constante velden privé. Als u deze openbaar wilt maken, gebruikt u in plaats daarvan een eigenschap.
Methoden
Een methode is een actie die een object kan uitvoeren. Is bijvoorbeeld Add een methode van het ComboBox object waarmee een nieuwe vermelding wordt toegevoegd aan een keuzelijst met invoervak.
In het volgende voorbeeld ziet u de Start methode van een Timer object.
Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()
Een methode is gewoon een procedure die door een object wordt weergegeven.
Zie Procedures voor meer informatie.
gebeurtenis
Een gebeurtenis is een actie die wordt herkend door een object, zoals klikken met de muis of op een toets drukken, en waarvoor u code kunt schrijven om te reageren. Gebeurtenissen kunnen optreden als gevolg van een gebruikersactie of programmacode, of ze kunnen worden veroorzaakt door het systeem. Code die een gebeurtenis aangeeft, wordt gezegd om de gebeurtenis te genereren en code die erop reageert, wordt gezegd om deze te verwerken .
U kunt ook uw eigen aangepaste gebeurtenissen ontwikkelen die door uw objecten worden gegenereerd en door andere objecten worden verwerkt. Zie Gebeurtenissen voor meer informatie.
Exemplaarleden en gedeelde leden
Wanneer u een object maakt op basis van een klasse, is het resultaat een exemplaar van die klasse. Leden die niet zijn gedeclareerd met het gedeelde trefwoord zijn exemplaarleden, die strikt tot dat specifieke exemplaar behoren. Een exemplaarlid in één exemplaar is onafhankelijk van hetzelfde lid in een ander exemplaar van dezelfde klasse. Een exemplaarlidvariabele kan bijvoorbeeld verschillende waarden in verschillende exemplaren hebben.
Leden die met het Shared
trefwoord zijn gedeclareerd, worden gedeelde leden, die deel uitmaken van de klasse als geheel en niet van een bepaald exemplaar. Een gedeeld lid bestaat slechts één keer, ongeacht het aantal exemplaren van de klasse dat u maakt, of zelfs als u geen exemplaren maakt. Een gedeelde lidvariabele heeft bijvoorbeeld slechts één waarde, die beschikbaar is voor alle code die toegang heeft tot de klasse.
Toegang tot niet-gedeelde leden
Zorg ervoor dat het object is gemaakt op basis van de klasse en is toegewezen aan een objectvariabele.
Dim secondForm As New System.Windows.Forms.Form
In de instructie die het lid opent, volgt u de naam van de objectvariabele met de operator voor lidtoegang (
.
) en vervolgens de lidnaam.secondForm.Show()
Toegang tot gedeelde leden
Volg de klassenaam met de operator voor lidtoegang (
.
) en vervolgens de lidnaam. U moet altijd rechtstreeks via de klassenaam toegang krijgen tot eenShared
lid van het object.Console.WriteLine("This computer is called " & Environment.MachineName)
Als u al een object uit de klasse hebt gemaakt, kunt u ook toegang krijgen tot een
Shared
lid via de variabele van het object.
Verschillen tussen klassen en modules
Het belangrijkste verschil tussen klassen en modules is dat klassen kunnen worden geïnstantieerd als objecten terwijl standaardmodules niet kunnen. Omdat er slechts één kopie van de gegevens van een standaardmodule is, krijgt elk ander deel van het programma dezelfde waarde als deze variabele wordt gelezen wanneer één deel van uw programma een openbare variabele in een standaardmodule wijzigt. Objectgegevens bestaan daarentegen afzonderlijk voor elk geïnstantieerd object. Een ander verschil is dat in tegenstelling tot standaardmodules klassen interfaces kunnen implementeren. Als een klasse is gemarkeerd met de MustInherit-modifier , kan deze niet rechtstreeks worden geïnstantieerd. Het is echter nog steeds anders dan een module, omdat deze kan worden overgenomen terwijl modules niet kunnen worden overgenomen.
Notitie
Wanneer de Shared
wijzigingsfunctie wordt toegepast op een klasselid, wordt deze gekoppeld aan de klasse zelf in plaats van een bepaald exemplaar van de klasse. Het lid wordt rechtstreeks geopend met behulp van de klassenaam, op dezelfde manier als moduleleden worden geopend.
Klassen en modules gebruiken ook verschillende bereiken voor hun leden. Leden die binnen een klasse zijn gedefinieerd, vallen binnen een specifiek exemplaar van de klasse en bestaan alleen voor de levensduur van het object. Als u toegang wilt krijgen tot klasseleden van buiten een klasse, moet u volledig gekwalificeerde namen gebruiken in de indeling van Object. Lid.
Leden die in een module zijn gedeclareerd, zijn daarentegen standaard openbaar toegankelijk en kunnen worden geopend door elke code die toegang heeft tot de module. Dit betekent dat variabelen in een standaardmodule effectief globale variabelen zijn, omdat ze zichtbaar zijn vanaf elke locatie in uw project en ze bestaan voor de levensduur van het programma.
Klassen en objecten opnieuw gebruiken
Met objecten kunt u variabelen en procedures één keer declareren en deze vervolgens opnieuw gebruiken wanneer dat nodig is. Als u bijvoorbeeld een spellingcontrole wilt toevoegen aan een toepassing, kunt u alle variabelen en ondersteuningsfuncties definiëren om de functionaliteit voor spellingcontrole te bieden. Als u de spellingcontrole als klasse maakt, kunt u deze opnieuw gebruiken in andere toepassingen door een verwijzing naar de gecompileerde assembly toe te voegen. Nog beter, u kunt misschien wat werk besparen met behulp van een spellingcontroleklasse die iemand anders al heeft ontwikkeld.
.NET biedt veel voorbeelden van onderdelen die beschikbaar zijn voor gebruik. In het volgende voorbeeld wordt de TimeZone klasse in de System naamruimte gebruikt. TimeZone biedt leden waarmee u informatie over de tijdzone van het huidige computersysteem kunt ophalen.
Public Sub ExamineTimeZone()
Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
Dim s As String = "Current time zone is "
s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
s &= "different from UTC (coordinated universal time)"
s &= vbCrLf & "and is currently "
If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
s &= "on ""summer time""."
Console.WriteLine(s)
End Sub
In het vorige voorbeeld declareert de eerste Dim-instructie een objectvariabele van het type TimeZone en wijst deze toe aan een TimeZone object dat door de CurrentTimeZone eigenschap wordt geretourneerd.
Relaties tussen objecten
Objecten kunnen op verschillende manieren aan elkaar worden gerelateerd. De belangrijkste soorten relaties zijn hiërarchisch en insluiting.
Hiërarchische relatie
Wanneer klassen worden afgeleid van meer fundamentele klassen, wordt gezegd dat ze een hiërarchische relatie hebben. Klassehiërarchieën zijn handig bij het beschrijven van items die een subtype van een meer algemene klasse zijn.
Stel dat u in het volgende voorbeeld een speciaal soort Button wilt definiëren dat vergelijkbaar is met een normaal Button , maar ook een methode beschikbaar maakt waarmee de voorgrond- en achtergrondkleuren worden omgekeerd.
Een klasse definiëren die is afgeleid van een reeds bestaande klasse
Gebruik een klasse-instructie om een klasse te definiëren waaruit u het gewenste object wilt maken.
Public Class ReversibleButton
Zorg ervoor dat een
End Class
instructie de laatste regel code in uw klas volgt. Standaard genereert de IDE (Integrated Development Environment) automatisch eenEnd Class
instructie wanneer u eenClass
instructie invoert.Volg de
Class
instructie onmiddellijk met een overname-instructie. Geef de klasse op waaruit uw nieuwe klasse is afgeleid.Inherits System.Windows.Forms.Button
Uw nieuwe klasse neemt alle leden over die zijn gedefinieerd door de basisklasse.
Voeg de code toe voor de extra leden die uw afgeleide klasse beschikbaar maakt. U kunt bijvoorbeeld een
ReverseColors
methode toevoegen en uw afgeleide klasse kan er als volgt uitzien:Public Class ReversibleButton Inherits System.Windows.Forms.Button Public Sub ReverseColors() Dim saveColor As System.Drawing.Color = Me.BackColor Me.BackColor = Me.ForeColor Me.ForeColor = saveColor End Sub End Class
Als u een object maakt op basis van de
ReversibleButton
klasse, heeft het toegang tot alle leden van de Button klasse, evenals deReverseColors
methode en eventuele andere nieuwe leden die u inReversibleButton
definieert.
Afgeleide klassen nemen leden over van de klasse waarop ze zijn gebaseerd, zodat u complexiteit kunt toevoegen tijdens de voortgang in een klassehiërarchie. Zie Basisbeginselen van overname voor meer informatie.
De code compileren
Zorg ervoor dat de compiler toegang heeft tot de klasse waaruit u uw nieuwe klasse wilt afleiden. Dit kan betekenen dat de naam volledig in aanmerking komt, zoals in het vorige voorbeeld, of het identificeren van de naamruimte in een importinstructie (.NET-naamruimte en -type). Als de klasse zich in een ander project bevindt, moet u mogelijk een verwijzing naar dat project toevoegen. Zie Verwijzingen in een project beheren voor meer informatie.
Containment-relatie
Een andere manier waarop objecten kunnen worden gerelateerd, is een insluitingsrelatie. Containerobjecten bevatten logisch andere objecten. Het object bevat bijvoorbeeld OperatingSystem logisch een Version object dat wordt geretourneerd via de Version eigenschap. Houd er rekening mee dat het containerobject geen fysiek ander object bevat.
Verzamelingen
Een bepaald type object insluiting wordt vertegenwoordigd door verzamelingen. Verzamelingen zijn groepen vergelijkbare objecten die kunnen worden geïnventariseerd. Visual Basic ondersteunt een specifieke syntaxis in de... Volgende instructie waarmee u de items van een verzameling kunt herhalen. Daarnaast kunt u Item[] met verzamelingen vaak elementen ophalen op basis van hun index of door ze te koppelen aan een unieke tekenreeks. Verzamelingen kunnen gemakkelijker worden gebruikt dan matrices, omdat u hiermee items kunt toevoegen of verwijderen zonder indexen te gebruiken. Vanwege hun gebruiksgemak worden verzamelingen vaak gebruikt om formulieren en besturingselementen op te slaan.
Verwante onderwerpen
Overzicht: Klassen definiëren
Biedt een stapsgewijze beschrijving van het maken van een klasse.
Overbelaste eigenschappen en methoden
Overbelaste eigenschappen en methoden
Basisprincipes van overname
Behandelt overnameaanpassingen, onderdrukkingsmethoden en eigenschappen, MyClass en MyBase.
Levensduur van objecten: hoe objecten worden gemaakt en vernietigd
Hiermee wordt het maken en verwijderen van klasse-exemplaren besproken.
Anonieme typen
Hierin wordt beschreven hoe u anonieme typen maakt en gebruikt, zodat u objecten kunt maken zonder een klassedefinitie voor het gegevenstype te schrijven.
Object initializers: Benoemde en anonieme typen
Beschrijft object initializers, die worden gebruikt voor het maken van exemplaren van benoemde en anonieme typen met behulp van één expressie.
Procedure: Eigenschapsnamen en -typen afleiden in anonieme typedeclaraties
Hierin wordt uitgelegd hoe u eigenschapsnamen en -typen in anonieme typedeclaraties kunt afleiden. Hier vindt u voorbeelden van geslaagde en mislukte deductie.