Programowanie obiektowe (Visual Basic)

Język Visual Basic zapewnia pełną obsługę programowania obiektowego, w tym hermetyzacji, dziedziczenia i polimorfizmu.

Hermetyzacja oznacza, że grupa powiązanych właściwości, metod i innych elementów członkowskich jest traktowana jako pojedyncza jednostka lub obiekt.

Dziedziczenie opisuje możliwość tworzenia nowych klas na podstawie istniejącej klasy.

Polimorfizm oznacza, że można mieć wiele klas, które mogą być używane zamiennie, mimo że każda klasa implementuje te same właściwości lub metody na różne sposoby.

W tej sekcji opisano następujące pojęcia:

Klasy i obiekty

Terminy klasy i obiektu są czasami używane zamiennie, ale w rzeczywistości klasy opisują typ obiektów, podczas gdy obiekty są użyteczne wystąpienia klas. Dlatego czynność tworzenia obiektu jest nazywana wystąpieniem. Korzystając z analogii strategii, klasa jest strategią, a obiekt jest budynkiem wykonanym z tej strategii.

Aby zdefiniować klasę:

Class SampleClass
End Class

Visual Basic udostępnia również lekką wersję klas nazywanych strukturami , które są przydatne, gdy trzeba utworzyć dużą tablicę obiektów i nie chcesz zużywać zbyt dużej ilości pamięci.

Aby zdefiniować strukturę:

Structure SampleStructure
End Structure

Aby uzyskać więcej informacji, zobacz:

Składowe klasy

Każda klasa może mieć różne składowe klasy, które zawierają właściwości opisujące dane klasy, metody definiujące zachowanie klasy i zdarzenia, które zapewniają komunikację między różnymi klasami i obiektami.

Właściwości i pola

Pola i właściwości reprezentują informacje, które zawiera obiekt. Pola są podobne do zmiennych, ponieważ mogą być odczytywane lub ustawiane bezpośrednio.

Aby zdefiniować pole:

Class SampleClass
    Public SampleField As String
End Class

Właściwości mają procedury pobierania i ustawiania, które zapewniają większą kontrolę nad sposobem ustawiania lub zwracania wartości.

Visual Basic umożliwia utworzenie pola prywatnego do przechowywania wartości właściwości lub użycie tak zwanych automatycznie zaimplementowanych właściwości, które automatycznie tworzą to pole w tle i zapewniają podstawową logikę procedur właściwości.

Aby zdefiniować właściwość zaimplementowaną automatycznie:

Class SampleClass
    Public Property SampleProperty as String
End Class

Jeśli musisz wykonać dodatkowe operacje odczytu i zapisu wartości właściwości, zdefiniuj pole do przechowywania wartości właściwości i podaj podstawową logikę przechowywania i pobierania:

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

Większość właściwości ma metody lub procedury ustawiania i pobierania wartości właściwości. Można jednak utworzyć właściwości tylko do odczytu lub tylko do zapisu, aby ograniczyć ich modyfikowanie lub odczytywanie. W języku Visual Basic można używać słów ReadOnly kluczowych i WriteOnly . Jednak właściwości implementowane automatycznie nie mogą być tylko do odczytu ani tylko do zapisu.

Aby uzyskać więcej informacji, zobacz:

Metody

Metoda to akcja, którą może wykonać obiekt.

Uwaga

W języku Visual Basic istnieją dwa sposoby tworzenia metody: Sub instrukcja jest używana, jeśli metoda nie zwraca wartości; Function instrukcja jest używana, jeśli metoda zwraca wartość.

Aby zdefiniować metodę klasy:

Class SampleClass
    Public Function SampleFunc(ByVal SampleParam As String)
        ' Add code here
    End Function
End Class

Klasa może mieć kilka implementacji lub przeciążeń tej samej metody, która różni się liczbą parametrów lub typów parametrów.

Aby przeciążyć 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

W większości przypadków deklarujesz metodę w definicji klasy. Jednak język Visual Basic obsługuje również metody rozszerzeń, które umożliwiają dodawanie metod do istniejącej klasy poza rzeczywistą definicją klasy.

Aby uzyskać więcej informacji, zobacz:

Konstruktory

Konstruktory to metody klas wykonywane automatycznie po utworzeniu obiektu danego typu. Konstruktory zwykle inicjują składowe danych nowego obiektu. Konstruktor może działać tylko raz po utworzeniu klasy. Ponadto kod w konstruktorze zawsze jest uruchamiany przed jakimkolwiek innym kodem w klasie. Można jednak utworzyć wiele przeciążeń konstruktorów w taki sam sposób jak w przypadku każdej innej metody.

Aby zdefiniować konstruktor dla klasy:

Class SampleClass
    Sub New(ByVal s As String)
        // Add code here.
    End Sub
End Class

Aby uzyskać więcej informacji, zobacz: Okres istnienia obiektu: Sposób tworzenia i niszczenia obiektów.

Destruktory

Destruktory są używane do destrukcji wystąpień klas. W programie .NET Framework moduł odśmieceń pamięci automatycznie zarządza alokacją i zwolnieniem pamięci dla zarządzanych obiektów w aplikacji. Jednak nadal może być konieczne destruktory w celu wyczyszczenia wszelkich niezarządzanych zasobów tworzonych przez aplikację. Dla klasy może istnieć tylko jeden destruktor.

Aby uzyskać więcej informacji na temat destruktorów i odzyskiwania pamięci w programie .NET Framework, zobacz Odzyskiwanie pamięci.

Zdarzenia

Zdarzenia umożliwiają klasie lub obiektowi powiadamianie innych klas lub obiektów, gdy wystąpi coś interesującego. Klasa, która wysyła (lub zgłasza) zdarzenie jest nazywane wydawcą, a klasy odbierające (lub obsługujące) zdarzenie są nazywane subskrybentami. Aby uzyskać więcej informacji o zdarzeniach, ich wywoływaniu i obsłudze, zobacz Zdarzenia.

  • Aby zadeklarować zdarzenia, użyj instrukcji event.

  • Aby zgłosić zdarzenia, użyj instrukcji RaiseEvent.

  • Aby określić procedury obsługi zdarzeń przy użyciu deklaratywnego sposobu, użyj instrukcji WithEvents i klauzuli Handles .

  • Aby móc dynamicznie dodawać, usuwać i zmieniać procedurę obsługi zdarzeń skojarzoną ze zdarzeniem, użyj instrukcji AddHandler i instrukcji RemoveHandler wraz z operatorem AddressOf.

Klasy zagnieżdżone

Klasa zdefiniowana w innej klasie jest nazywana zagnieżdżonym. Domyślnie zagnieżdżona klasa jest prywatna.

Class Container
    Class Nested
    ' Add code here.
    End Class
End Class

Aby utworzyć wystąpienie zagnieżdżonej klasy, użyj nazwy klasy kontenera, a następnie kropki, a następnie nazwy zagnieżdżonej klasy:

Dim nestedInstance As Container.Nested = New Container.Nested()

Modyfikatory dostępu i poziomy dostępu

Wszystkie klasy i składowe klas mogą określać, jaki poziom dostępu zapewniają innym klasom przy użyciu modyfikatorów dostępu.

Dostępne są następujące modyfikatory dostępu:

Modyfikator Języka Visual Basic Definicja
Public Dostęp do typu lub elementu członkowskiego można uzyskać za pomocą dowolnego innego kodu w tym samym zestawie lub innym zestawie odwołującym się do niego.
Private Dostęp do typu lub elementu członkowskiego można uzyskać tylko za pomocą kodu w tej samej klasie.
Protected Dostęp do typu lub składowej można uzyskać tylko za pomocą kodu w tej samej klasie lub w klasie pochodnej.
Friend Dostęp do typu lub elementu członkowskiego można uzyskać za pomocą dowolnego kodu w tym samym zestawie, ale nie z innego zestawu.
Protected Friend Dostęp do typu lub składowej można uzyskać za pomocą dowolnego kodu w tym samym zestawie lub dowolnej klasy pochodnej w innym zestawie.

Aby uzyskać więcej informacji, zobacz Poziomy dostępu w Visual Basic.

Tworzenie wystąpień klas

Aby utworzyć obiekt, należy utworzyć wystąpienie klasy lub utworzyć wystąpienie klasy.

Dim sampleObject as New SampleClass()

Po utworzeniu wystąpienia klasy można przypisać wartości do właściwości i pól wystąpienia oraz wywołać metody klas.

' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()

Aby przypisać wartości do właściwości podczas procesu tworzenia wystąpienia klasy, użyj inicjatorów obiektów:

Dim sampleObject = New SampleClass With
    {.FirstProperty = "A", .SecondProperty = "B"}

Aby uzyskać więcej informacji, zobacz:

Udostępnione klasy i elementy członkowskie

Współużytkowany element członkowski klasy jest właściwością, procedurą lub polem, które jest współużytkowane przez wszystkie wystąpienia klasy.

Aby zdefiniować współużytkowanego członka:

Class SampleClass
    Public Shared SampleString As String = "Sample String"
End Class

Aby uzyskać dostęp do udostępnionego elementu członkowskiego, użyj nazwy klasy bez tworzenia obiektu tej klasy:

MsgBox(SampleClass.SampleString)

Udostępnione moduły w Visual Basic mają tylko udostępnione elementy członkowskie i nie mogą być tworzone wystąpienia. Udostępnione elementy członkowskie nie mogą również uzyskiwać dostępu do właściwości, pól lub metod innych niż udostępnione

Aby uzyskać więcej informacji, zobacz:

Typy anonimowe

Typy anonimowe umożliwiają tworzenie obiektów bez konieczności pisania definicji klasy dla typu danych. Zamiast tego kompilator generuje klasę. Klasa nie ma nazwy użytecznej i zawiera właściwości określone w deklarowaniu obiektu.

Aby utworzyć wystąpienie typu anonimowego:

' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
    New With {Key .FirstProperty = "A", .SecondProperty = "B"}

Aby uzyskać więcej informacji, zobacz: Typy anonimowe.

Dziedziczenie

Dziedziczenie umożliwia utworzenie nowej klasy, która ponownie używa, rozszerza i modyfikuje zachowanie zdefiniowane w innej klasie. Klasa, której składowe są dziedziczone, jest nazywana klasą bazową, a klasa dziedziczące te składowe jest nazywana klasą pochodną. Jednak wszystkie klasy w Visual Basic niejawnie dziedziczą z Object klasy obsługującej hierarchię klas platformy .NET i udostępniają usługi niskiego poziomu dla wszystkich klas.

Uwaga

Język Visual Basic nie obsługuje wielu dziedziczenia. Oznacza to, że można określić tylko jedną klasę bazową dla klasy pochodnej.

Aby dziedziczyć z klasy bazowej:

Class DerivedClass
    Inherits BaseClass
End Class

Domyślnie wszystkie klasy mogą być dziedziczone. Można jednak określić, czy klasa nie może być używana jako klasa bazowa, czy też utworzyć klasę, która może być używana tylko jako klasa bazowa.

Aby określić, że nie można użyć klasy jako klasy bazowej:

NotInheritable Class SampleClass
End Class

Aby określić, że klasę można użyć tylko jako klasy bazowej i nie można utworzyć wystąpienia:

MustInherit Class BaseClass
End Class

Aby uzyskać więcej informacji, zobacz:

Zastępowanie elementów członkowskich

Domyślnie klasa pochodna dziedziczy wszystkie elementy członkowskie z klasy bazowej. Jeśli chcesz zmienić zachowanie dziedziczonego elementu członkowskiego, należy go zastąpić. Oznacza to, że można zdefiniować nową implementację metody, właściwości lub zdarzenia w klasie pochodnej.

Następujące modyfikatory służą do kontrolowania sposobu zastępowania właściwości i metod:

Modyfikator Języka Visual Basic Definicja
Overridable Umożliwia zastąpienie składowej klasy w klasie pochodnej.
Overrides Zastępuje wirtualną (przesłoniętą) składową zdefiniowaną w klasie bazowej.
NotOverridable Uniemożliwia zastępowanie elementu członkowskiego w klasie dziedziczonej.
MustOverride Wymaga zastąpienia składowej klasy w klasie pochodnej.
Shadows Ukrywa element członkowski dziedziczony z klasy bazowej

Interfejsy

Interfejsy, takie jak klasy, definiują zestaw właściwości, metod i zdarzeń. Jednak w przeciwieństwie do klas interfejsy nie zapewniają implementacji. Są one implementowane przez klasy i definiowane jako oddzielne jednostki od klas. Interfejs reprezentuje kontrakt w tej klasie, która implementuje interfejs, musi implementować każdy aspekt tego interfejsu dokładnie tak, jak jest zdefiniowany.

Aby zdefiniować interfejs:

Public Interface ISampleInterface
    Sub DoSomething()
End Interface

Aby zaimplementować interfejs w klasie:

Class SampleClass
    Implements ISampleInterface
    Sub DoSomething
        ' Method implementation.
    End Sub
End Class

Aby uzyskać więcej informacji, zobacz:

Typy ogólne

Klasy, struktury, interfejsy i metody na platformie .NET mogą zawierać parametry typu definiujące typy obiektów, które mogą przechowywać lub używać. Najczęstszym przykładem typów ogólnych jest kolekcja, w której można określić typ obiektów, które mają być przechowywane w kolekcji.

Aby zdefiniować klasę ogólną:

Class SampleGeneric(Of T)
    Public Field As T
End Class

Aby utworzyć wystąpienie klasy ogólnej:

Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"

Aby uzyskać więcej informacji, zobacz:

Delegaci

Delegat to typ, który definiuje sygnaturę metody i może dostarczyć odwołanie do dowolnej metody z zgodnym podpisem. Metodę można wywołać (lub wywołać) za pośrednictwem delegata. Delegaty służą do przekazywania metod jako argumentów do innych metod.

Uwaga

Programy obsługi zdarzeń to po prostu metody, które są wywoływane za pośrednictwem delegatów. Aby uzyskać więcej informacji na temat używania delegatów w obsłudze zdarzeń, zobacz Zdarzenia.

Aby utworzyć delegata:

Delegate Sub SampleDelegate(ByVal str As String)

Aby utworzyć odwołanie do metody zgodnej z podpisem określonym przez delegata:

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

Aby uzyskać więcej informacji, zobacz:

Zobacz też