Objectgeoriënteerd programmeren (Visual Basic)
Visual Basic biedt volledige ondersteuning voor objectgeoriënteerde programmering, waaronder inkapseling, overname en polymorfisme.
Inkapseling betekent dat een groep gerelateerde eigenschappen, methoden en andere leden worden behandeld als één eenheid of object.
Overname beschrijft de mogelijkheid om nieuwe klassen te maken op basis van een bestaande klasse.
Polymorfisme betekent dat u meerdere klassen kunt hebben die door elkaar kunnen worden gebruikt, ook al implementeert elke klasse op verschillende manieren dezelfde eigenschappen of methoden.
In deze sectie worden de volgende concepten beschreven:
Klassen en objecten
De termenklasse en het object worden soms door elkaar gebruikt, maar in feite beschrijven klassen het type objecten, terwijl objecten bruikbare exemplaren van klassen zijn. Het maken van een object wordt dus instantiation genoemd. Een klasse is een blauwdruk met de analogie van de blauwdruk en een object is een gebouw dat is gemaakt van die blauwdruk.
Een klasse definiëren:
Class SampleClass
End Class
Visual Basic biedt ook een light-versie van klassen die structuren worden genoemd die handig zijn wanneer u een grote reeks objecten moet maken en hiervoor niet te veel geheugen wilt gebruiken.
Een structuur definiëren:
Structure SampleStructure
End Structure
Zie voor meer informatie:
Klasleden
Elke klasse kan verschillende klasseleden hebben die eigenschappen bevatten die klassegegevens beschrijven, methoden die klassegedrag definiëren en gebeurtenissen die communicatie tussen verschillende klassen en objecten bieden.
Eigenschappen en velden
Velden en eigenschappen vertegenwoordigen informatie die een object bevat. Velden zijn net als variabelen omdat ze rechtstreeks kunnen worden gelezen of ingesteld.
Een veld definiëren:
Class SampleClass
Public SampleField As String
End Class
Eigenschappen hebben procedures voor ophalen en instellen, die meer controle bieden over hoe waarden worden ingesteld of geretourneerd.
Met Visual Basic kunt u een privéveld maken voor het opslaan van de eigenschapswaarde of het gebruik van zogenaamde automatisch geïmplementeerde eigenschappen die dit veld automatisch achter de schermen maken en de basislogica voor de eigenschapsprocedures opgeven.
Een automatisch geïmplementeerde eigenschap definiëren:
Class SampleClass
Public Property SampleProperty as String
End Class
Als u extra bewerkingen wilt uitvoeren voor het lezen en schrijven van de eigenschapswaarde, definieert u een veld voor het opslaan van de eigenschapswaarde en geeft u de basislogica op voor het opslaan en ophalen ervan:
Class SampleClass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
De meeste eigenschappen hebben methoden of procedures voor het instellen en ophalen van de eigenschapswaarde. U kunt echter alleen-lezen- of alleen-schrijven-eigenschappen maken om te voorkomen dat ze worden gewijzigd of gelezen. In Visual Basic kunt u trefwoorden gebruiken en WriteOnly
trefwoorden gebruikenReadOnly
. Automatisch geïmplementeerde eigenschappen kunnen echter niet alleen-lezen of alleen-schrijven zijn.
Zie voor meer informatie:
Methoden
Een methode is een actie die een object kan uitvoeren.
Notitie
In Visual Basic zijn er twee manieren om een methode te maken: de Sub
instructie wordt gebruikt als de methode geen waarde retourneert. De Function
instructie wordt gebruikt als een methode een waarde retourneert.
Een methode van een klasse definiëren:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
Een klasse kan verschillende implementaties of overbelastingen hebben van dezelfde methode die verschilt in het aantal parameters of parametertypen.
Een methode overbelasten:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
In de meeste gevallen declareert u een methode binnen een klassedefinitie. Visual Basic biedt echter ook ondersteuning voor uitbreidingsmethoden waarmee u methoden kunt toevoegen aan een bestaande klasse buiten de werkelijke definitie van de klasse.
Zie voor meer informatie:
Constructors
Constructors zijn klassemethoden die automatisch worden uitgevoerd wanneer een object van een bepaald type wordt gemaakt. Constructors initialiseren meestal de gegevensleden van het nieuwe object. Een constructor kan slechts eenmaal worden uitgevoerd wanneer een klasse wordt gemaakt. Bovendien wordt de code in de constructor altijd uitgevoerd vóór andere code in een klasse. U kunt echter meerdere constructoroverbelastingen op dezelfde manier maken als voor elke andere methode.
Een constructor definiëren voor een klasse:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
Zie voor meer informatie: Levensduur van objecten: Hoe objecten worden gemaakt en vernietigd.
Destructors
Destructors worden gebruikt om instanties van klassen te destructeren. In .NET Framework beheert de garbagecollector automatisch de toewijzing en het vrijlaten van geheugen voor de beheerde objecten in uw toepassing. Mogelijk hebt u echter nog steeds destructors nodig om onbeheerde resources op te schonen die door uw toepassing worden gemaakt. Er kan slechts één destructor voor een klasse zijn.
Zie Garbagecollection voor meer informatie over destructors en garbagecollection in .NET Framework.
gebeurtenis
Met gebeurtenissen kan een klasse of object andere klassen of objecten op de hoogte stellen wanneer er iets van belang is. De klasse die de gebeurtenis verzendt (of genereert) wordt de uitgever genoemd en de klassen die de gebeurtenis ontvangen (of verwerken) worden abonnees genoemd. Zie Gebeurtenissen voor meer informatie over gebeurtenissen, hoe deze worden gegenereerd en verwerkt.
Als u gebeurtenissen wilt declareren, gebruikt u de gebeurtenisinstructie.
Als u gebeurtenissen wilt genereren, gebruikt u de Instructie RaiseEvent.
Als u gebeurtenis-handlers op een declaratieve manier wilt opgeven, gebruikt u de WithEvents-instructie en de Handles-component .
Als u de gebeurtenishandler die is gekoppeld aan een gebeurtenis dynamisch wilt toevoegen, verwijderen en wijzigen, gebruikt u de AddHandler-instructie en RemoveHandler-instructie samen met de AddressOf-operator.
Geneste klassen
Een klasse die in een andere klasse is gedefinieerd, wordt genest genoemd. Standaard is de geneste klasse privé.
Class Container
Class Nested
' Add code here.
End Class
End Class
Als u een exemplaar van de geneste klasse wilt maken, gebruikt u de naam van de containerklasse gevolgd door de punt en vervolgens de naam van de geneste klasse:
Dim nestedInstance As Container.Nested = New Container.Nested()
Toegangsaanpassingen en toegangsniveaus
Alle klassen en klasleden kunnen opgeven welk toegangsniveau ze bieden aan andere klassen met behulp van toegangsaanpassingen.
De volgende toegangsaanpassingen zijn beschikbaar:
Visual Basic Modifier | Definitie |
---|---|
Openbaar | Het type of lid kan worden geopend door elke andere code in dezelfde assembly of een andere assembly die ernaar verwijst. |
Privé | Het type of lid kan alleen worden geopend met code in dezelfde klasse. |
Beschermd | Het type of lid kan alleen worden geopend met code in dezelfde klasse of in een afgeleide klasse. |
Vriend | Het type of lid kan worden geopend door elke code in dezelfde assembly, maar niet vanuit een andere assembly. |
Protected Friend |
Het type of lid kan worden geopend door elke code in dezelfde assembly of door een afgeleide klasse in een andere assembly. |
Zie Access-niveaus in Visual Basic voor meer informatie.
Klassen instantiëren
Als u een object wilt maken, moet u een instantie van een klasse maken of een klasse-exemplaar maken.
Dim sampleObject as New SampleClass()
Nadat u een klasse hebt geïnstrigeren, kunt u waarden toewijzen aan de eigenschappen en velden van het exemplaar en klassemethoden aanroepen.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
Als u waarden wilt toewijzen aan eigenschappen tijdens het proces van klasse-instantiëring, gebruikt u objectinitiitiizers:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
Zie voor meer informatie:
Gedeelde klassen en leden
Een gedeeld lid van de klasse is een eigenschap, procedure of veld dat wordt gedeeld door alle exemplaren van een klasse.
Een gedeeld lid definiëren:
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
Als u toegang wilt krijgen tot het gedeelde lid, gebruikt u de naam van de klasse zonder een object van deze klasse te maken:
MsgBox(SampleClass.SampleString)
Gedeelde modules in Visual Basic hebben alleen gedeelde leden en kunnen niet worden geïnstantieerd. Gedeelde leden hebben ook geen toegang tot niet-gedeelde eigenschappen, velden of methoden
Zie voor meer informatie:
Anonieme typen
Met anonieme typen kunt u objecten maken zonder een klassedefinitie voor het gegevenstype te schrijven. In plaats daarvan genereert de compiler een klasse voor u. De klasse heeft geen bruikbare naam en bevat de eigenschappen die u opgeeft bij het declareren van het object.
Een exemplaar van een anoniem type maken:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
Zie voor meer informatie: Anonieme typen.
Overname
Met overname kunt u een nieuwe klasse maken die het gedrag dat is gedefinieerd in een andere klasse opnieuw gebruikt, uitbreidt en wijzigt. De klasse waarvan de leden worden overgenomen, wordt de basisklasse genoemd en de klasse die deze leden over neemt, wordt de afgeleide klasse genoemd. Alle klassen in Visual Basic nemen echter impliciet over van de Object klasse die ondersteuning biedt voor .NET-klassenhiërarchie en bieden services op laag niveau aan alle klassen.
Notitie
Visual Basic biedt geen ondersteuning voor meerdere overnames. Dat wil gezegd, u kunt slechts één basisklasse opgeven voor een afgeleide klasse.
Overnemen van een basisklasse:
Class DerivedClass
Inherits BaseClass
End Class
Standaard kunnen alle klassen worden overgenomen. U kunt echter opgeven of een klasse niet mag worden gebruikt als basisklasse of een klasse mag maken die alleen als basisklasse kan worden gebruikt.
Als u wilt opgeven dat een klasse niet kan worden gebruikt als basisklasse:
NotInheritable Class SampleClass
End Class
Als u wilt opgeven dat een klasse alleen als basisklasse kan worden gebruikt en niet kan worden geïnstantieerd:
MustInherit Class BaseClass
End Class
Zie voor meer informatie:
Leden overschrijven
Standaard neemt een afgeleide klasse alle leden over van de basisklasse. Als u het gedrag van het overgenomen lid wilt wijzigen, moet u dit overschrijven. Dat wil gezegd, u kunt een nieuwe implementatie van de methode, eigenschap of gebeurtenis definiëren in de afgeleide klasse.
De volgende modifiers worden gebruikt om te bepalen hoe eigenschappen en methoden worden overschreven:
Visual Basic Modifier | Definitie |
---|---|
Overschrijfbaar | Hiermee kan een klasselid worden overschreven in een afgeleide klasse. |
Overschrijft | Hiermee overschrijft u een virtueel (overschrijfbaar) lid dat is gedefinieerd in de basisklasse. |
NotOverridable | Hiermee voorkomt u dat een lid wordt overschreven in een overnemende klasse. |
MustOverride | Vereist dat een klasselid wordt overschreven in de afgeleide klasse. |
Schaduwen | Hiermee verbergt u een lid dat is overgenomen van een basisklasse |
Interfaces
Interfaces, zoals klassen, definiëren een set eigenschappen, methoden en gebeurtenissen. Maar in tegenstelling tot klassen bieden interfaces geen implementatie. Ze worden geïmplementeerd door klassen en gedefinieerd als afzonderlijke entiteiten van klassen. Een interface vertegenwoordigt een contract, omdat een klasse die een interface implementeert elk aspect van die interface precies moet implementeren zoals deze is gedefinieerd.
Een interface definiëren:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
Een interface implementeren in een klasse:
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
Zie voor meer informatie:
Generics
Klassen, structuren, interfaces en methoden in .NET kunnen typeparameters bevatten die typen objecten definiëren die ze kunnen opslaan of gebruiken. Het meest voorkomende voorbeeld van generieken is een verzameling, waarin u het type objecten kunt opgeven dat moet worden opgeslagen in een verzameling.
Een algemene klasse definiëren:
Class SampleGeneric(Of T)
Public Field As T
End Class
Een exemplaar van een algemene klasse maken:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
Zie voor meer informatie:
Gedelegeerden
Een gemachtigde is een type dat een methodehandtekening definieert en een verwijzing kan bieden naar elke methode met een compatibele handtekening. U kunt de methode aanroepen (of aanroepen) via de gemachtigde. Gemachtigden worden gebruikt om methoden als argumenten door te geven aan andere methoden.
Notitie
Gebeurtenis-handlers zijn niets meer dan methoden die worden aangeroepen via gemachtigden. Zie Gebeurtenissen voor meer informatie over het gebruik van gemachtigden bij het verwerken van gebeurtenissen.
Een gemachtigde maken:
Delegate Sub SampleDelegate(ByVal str As String)
Een verwijzing maken naar een methode die overeenkomt met de handtekening die is opgegeven door de gemachtigde:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
Zie voor meer informatie: