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

  1. 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
    
  2. 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
    
  3. Voeg het trefwoord Nieuwe operator toe om de variabele te initialiseren in een nieuw exemplaar van de klasse.

    Dim nextCustomer As New Customer
    
  4. 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 of False is toegewezen aan een Boolean variabele.

  • Elke waarde in het bereik dat wordt ondersteund door het gegevenstype, is geldig. Dit geldt voor veel eigenschappen van het type Single of Double.

  • 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

  1. 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
    
  2. 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 een Shared 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

  1. 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 een End Class instructie wanneer u een Class instructie invoert.

  2. 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.

  3. 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 de ReverseColors methode en eventuele andere nieuwe leden die u in ReversibleButtondefinieert.

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.

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.