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ć automatycznie zaimplementowaną właściwość:
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 automatycznie zaimplementowane właściwości 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 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: