Objektorienterad programmering (Visual Basic)
Visual Basic har fullt stöd för objektorienterad programmering, inklusive inkapsling, arv och polymorfism.
Inkapsling innebär att en grupp med relaterade egenskaper, metoder och andra medlemmar behandlas som en enda enhet eller ett objekt.
Arv beskriver möjligheten att skapa nya klasser baserat på en befintlig klass.
Polymorfism innebär att du kan ha flera klasser som kan användas omväxlande, även om varje klass implementerar samma egenskaper eller metoder på olika sätt.
I det här avsnittet beskrivs följande begrepp:
Klasser och objekt
Termerna klass och objekt används ibland utbytbart, men i själva verket beskriver klasser typen av objekt, medan objekt är användbara instanser av klasser. Därför kallas åtgärden att skapa ett objekt instansiering. Med hjälp av skissanalogin är en klass en skiss och ett objekt är en byggnad gjord av den skissen.
Så här definierar du en klass:
Class SampleClass
End Class
Visual Basic innehåller också en lätt version av klasser som kallas strukturer som är användbara när du behöver skapa en stor matris med objekt och inte vill använda för mycket minne för det.
Så här definierar du en struktur:
Structure SampleStructure
End Structure
Mer information finns i:
Klassmedlemmar
Varje klass kan ha olika klassmedlemmar som innehåller egenskaper som beskriver klassdata, metoder som definierar klassbeteende och händelser som ger kommunikation mellan olika klasser och objekt.
Egenskaper och fält
Fält och egenskaper representerar information som ett objekt innehåller. Fält är som variabler eftersom de kan läsas eller anges direkt.
Så här definierar du ett fält:
Class SampleClass
Public SampleField As String
End Class
Egenskaper har hämta och ange procedurer, vilket ger mer kontroll över hur värden anges eller returneras.
Med Visual Basic kan du antingen skapa ett privat fält för att lagra egenskapsvärdet eller använda så kallade automatiskt implementerade egenskaper som skapar det här fältet automatiskt i bakgrunden och tillhandahåller den grundläggande logiken för egenskapsprocedurerna.
Så här definierar du en automatiskt implementerad egenskap:
Class SampleClass
Public Property SampleProperty as String
End Class
Om du behöver utföra några ytterligare åtgärder för att läsa och skriva egenskapsvärdet definierar du ett fält för lagring av egenskapsvärdet och anger den grundläggande logiken för att lagra och hämta det:
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 flesta egenskaper har metoder eller procedurer för att både ange och hämta egenskapsvärdet. Du kan dock skapa skrivskyddade eller skrivskyddade egenskaper för att hindra dem från att ändras eller läsas. I Visual Basic kan du använda ReadOnly
och WriteOnly
nyckelord. Men automatiskt implementerade egenskaper kan inte vara skrivskyddade eller skrivskyddade.
Mer information finns i:
Metoder
En metod är en åtgärd som ett objekt kan utföra.
Kommentar
I Visual Basic finns det två sätt att skapa en metod: -instruktionen Sub
används om metoden inte returnerar ett värde. -instruktionen Function
används om en metod returnerar ett värde.
Så här definierar du en metod för en klass:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
En klass kan ha flera implementeringar, eller överlagringar, av samma metod som skiljer sig åt i antalet parametrar eller parametertyper.
Så här överbelastar du en metod:
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
I de flesta fall deklarerar du en metod inom en klassdefinition. Visual Basic har dock även stöd för tilläggsmetoder som gör att du kan lägga till metoder i en befintlig klass utanför den faktiska definitionen av klassen.
Mer information finns i:
Konstruktorer
Konstruktorer är klassmetoder som körs automatiskt när ett objekt av en viss typ skapas. Konstruktorer initierar vanligtvis datamedlemmar i det nya objektet. En konstruktor kan bara köras en gång när en klass skapas. Dessutom körs koden i konstruktorn alltid före någon annan kod i en klass. Du kan dock skapa flera konstruktoröverlagringar på samma sätt som för andra metoder.
Så här definierar du en konstruktor för en klass:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
Mer information finns i: Objektlivslängd: Hur objekt skapas och förstörs.
Destructors
Destructors används för att destruct instanser av klasser. I .NET Framework hanterar skräpinsamlaren automatiskt allokeringen och frigörandet av minne för de hanterade objekten i ditt program. Du kan dock fortfarande behöva destruktorer för att rensa alla ohanterade resurser som programmet skapar. Det kan bara finnas en destructor för en klass.
Mer information om destructors och skräpinsamling i .NET Framework finns i Skräpinsamling.
Händelser
Händelser gör det möjligt för en klass eller ett objekt att meddela andra klasser eller objekt när något av intresse inträffar. Klassen som skickar (eller höjer) händelsen kallas utgivare och de klasser som tar emot (eller hanterar) händelsen kallas prenumeranter. Mer information om händelser, hur de höjs och hanteras finns i Händelser.
Om du vill deklarera händelser använder du händelseuttryck.
Använd RaiseEvent-instruktionen för att skapa händelser.
Om du vill ange händelsehanterare på ett deklarativt sätt använder du WithEvents-instruktionen och handles-satsen .
För att dynamiskt kunna lägga till, ta bort och ändra händelsehanteraren som är associerad med en händelse använder du AddHandler-instruktionen och RemoveHandler-instruktionen tillsammans med AddressOf-operatorn.
Kapslade klasser
En klass som definieras i en annan klass kallas kapslad. Som standard är den kapslade klassen privat.
Class Container
Class Nested
' Add code here.
End Class
End Class
Om du vill skapa en instans av den kapslade klassen använder du namnet på containerklassen följt av punkten och sedan namnet på den kapslade klassen:
Dim nestedInstance As Container.Nested = New Container.Nested()
Åtkomstmodifierare och åtkomstnivåer
Alla klasser och klassmedlemmar kan ange vilken åtkomstnivå de tillhandahåller till andra klasser med hjälp av åtkomstmodifierare.
Följande åtkomstmodifierare är tillgängliga:
Visual Basic-modifierare | Definition |
---|---|
Offentlig | Typen eller medlemmen kan nås av någon annan kod i samma sammansättning eller en annan sammansättning som refererar till den. |
Privat | Typen eller medlemmen kan bara nås med kod i samma klass. |
Skyddad | Typen eller medlemmen kan bara nås med kod i samma klass eller i en härledd klass. |
Vän | Typen eller medlemmen kan nås av valfri kod i samma sammansättning, men inte från en annan sammansättning. |
Protected Friend |
Typen eller medlemmen kan nås av valfri kod i samma sammansättning eller av någon härledd klass i en annan sammansättning. |
Mer information finns i Åtkomstnivåer i Visual Basic.
Instansiera klasser
Om du vill skapa ett objekt måste du instansiera en klass eller skapa en klassinstans.
Dim sampleObject as New SampleClass()
När du har instansierar en klass kan du tilldela värden till instansens egenskaper och fält och anropa klassmetoder.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
Om du vill tilldela värden till egenskaper under klassinstansieringsprocessen använder du objektinitierare:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
Mer information finns i:
Delade klasser och medlemmar
En delad medlem i klassen är en egenskap, en procedur eller ett fält som delas av alla instanser av en klass.
Så här definierar du en delad medlem:
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
Om du vill komma åt den delade medlemmen använder du namnet på klassen utan att skapa ett objekt i den här klassen:
MsgBox(SampleClass.SampleString)
Delade moduler i Visual Basic har endast delade medlemmar och kan inte instansieras. Delade medlemmar kan inte heller komma åt icke-delade egenskaper, fält eller metoder
Mer information finns i:
Anonyma typer
Med anonyma typer kan du skapa objekt utan att skriva en klassdefinition för datatypen. I stället genererar kompilatorn en klass åt dig. Klassen har inget användbart namn och innehåller de egenskaper som du anger när objektet deklareras.
Så här skapar du en instans av en anonym typ:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
Mer information finns i: Anonyma typer.
Arv
Med arv kan du skapa en ny klass som återanvänder, utökar och ändrar det beteende som definieras i en annan klass. Klassen vars medlemmar ärvs kallas för basklassen och klassen som ärver dessa medlemmar kallas för den härledda klassen. Alla klasser i Visual Basic ärver dock implicit från klassen Object som stöder .NET-klasshierarki och tillhandahåller tjänster på låg nivå till alla klasser.
Kommentar
Visual Basic stöder inte flera arv. Du kan alltså bara ange en basklass för en härledd klass.
Så här ärver du från en basklass:
Class DerivedClass
Inherits BaseClass
End Class
Som standard kan alla klasser ärvas. Du kan dock ange om en klass inte får användas som basklass eller skapa en klass som endast kan användas som basklass.
Så här anger du att en klass inte kan användas som basklass:
NotInheritable Class SampleClass
End Class
Om du vill ange att en klass endast kan användas som basklass och inte kan instansieras:
MustInherit Class BaseClass
End Class
Mer information finns i:
Åsidosättande medlemmar
Som standard ärver en härledd klass alla medlemmar från basklassen. Om du vill ändra beteendet för den ärvda medlemmen måste du åsidosätta den. Du kan alltså definiera en ny implementering av metoden, egenskapen eller händelsen i den härledda klassen.
Följande modifierare används för att styra hur egenskaper och metoder åsidosättas:
Visual Basic-modifierare | Definition |
---|---|
Kan åsidosättas | Tillåter att en klassmedlem åsidosättas i en härledd klass. |
Åsidosätter | Åsidosätter en virtuell (åsidosättningsbar) medlem som definierats i basklassen. |
NotOverridable | Hindrar en medlem från att åsidosättas i en ärvande klass. |
MustOverride | Kräver att en klassmedlem åsidosätts i den härledda klassen. |
Skuggor | Döljer en medlem som ärvts från en basklass |
Gränssnitt
Gränssnitt, till exempel klasser, definierar en uppsättning egenskaper, metoder och händelser. Men till skillnad från klasser tillhandahåller gränssnitt inte implementering. De implementeras av klasser och definieras som separata entiteter från klasser. Ett gränssnitt representerar ett kontrakt, eftersom en klass som implementerar ett gränssnitt måste implementera varje aspekt av gränssnittet exakt som det definieras.
Så här definierar du ett gränssnitt:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
Så här implementerar du ett gränssnitt i en klass:
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
Mer information finns i:
Generika
Klasser, strukturer, gränssnitt och metoder i .NET kan innehålla typparametrar som definierar typer av objekt som de kan lagra eller använda. Det vanligaste exemplet på generiska objekt är en samling där du kan ange vilken typ av objekt som ska lagras i en samling.
Så här definierar du en allmän klass:
Class SampleGeneric(Of T)
Public Field As T
End Class
Så här skapar du en instans av en allmän klass:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
Mer information finns i:
Delegeringar
Ett ombud är en typ som definierar en metodsignatur och kan ge en referens till valfri metod med en kompatibel signatur. Du kan anropa (eller anropa) metoden via ombudet. Ombud används för att skicka metoder som argument till andra metoder.
Kommentar
Händelsehanterare är inget annat än metoder som anropas via ombud. Mer information om hur du använder ombud i händelsehantering finns i Händelser.
Så här skapar du ett ombud:
Delegate Sub SampleDelegate(ByVal str As String)
Så här skapar du en referens till en metod som matchar signaturen som anges av ombudet:
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
Mer information finns i: