Obiekty i klasy w Visual Basic

Obiekt jest kombinacją kodu i danych, które mogą być traktowane jako jednostka. Obiekt może być elementem aplikacji, na przykład kontrolką lub formularzem. Cała aplikacja może być również obiektem.

Podczas tworzenia aplikacji w Visual Basic stale pracujesz z obiektami. Można używać obiektów udostępnianych przez Visual Basic, takich jak kontrolki, formularze i obiekty dostępu do danych. Można również używać obiektów z innych aplikacji w aplikacji Visual Basic. Można nawet tworzyć własne obiekty i definiować dla nich dodatkowe właściwości i metody. Obiekty działają jak prefabrykowane bloki konstrukcyjne dla programów — umożliwiają one napisanie fragmentu kodu raz i ponowne użycie go w całym systemie.

W tym temacie omówiono szczegółowo obiekty.

Obiekty i klasy

Każdy obiekt w Visual Basic jest definiowany przez klasę. Klasa opisuje zmienne, właściwości, procedury i zdarzenia obiektu. Obiekty są wystąpieniami klas; Możesz utworzyć dowolną liczbę potrzebnych obiektów po zdefiniowaniu klasy.

Aby zrozumieć relację między obiektem a jego klasą, pomyśl o frezach cookie i plikach cookie. Frez cookie jest klasą. Definiuje cechy każdego pliku cookie, na przykład rozmiar i kształt. Klasa służy do tworzenia obiektów. Obiekty są plikami cookie.

Przed uzyskaniem dostępu do jego składowych należy utworzyć obiekt, z wyjątkiem Shared elementów członkowskich, do których można uzyskać dostęp bez obiektu klasy.

Tworzenie obiektu na podstawie klasy

  1. Określ, z której klasy chcesz utworzyć obiekt, lub zdefiniuj własną klasę. Na przykład:

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Napisz instrukcję Dim , aby utworzyć zmienną, do której można przypisać wystąpienie klasy. Zmienna powinna być typu żądanej klasy.

    Dim nextCustomer As Customer
    
  3. Dodaj słowo kluczowe New Operator , aby zainicjować zmienną do nowego wystąpienia klasy.

    Dim nextCustomer As New Customer
    
  4. Teraz możesz uzyskać dostęp do składowych klasy za pomocą zmiennej obiektu.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Uwaga

Jeśli to możliwe, należy zadeklarować zmienną jako typ klasy, którą chcesz przypisać do niej. Jest to nazywane wczesnym powiązaniem. Jeśli nie znasz typu klasy w czasie kompilacji, możesz wywołać późne powiązanie , deklarując zmienną o typie danych obiektu. Jednak późne powiązanie może spowolnić wydajność i ograniczyć dostęp do elementów członkowskich obiektu czasu wykonywania. Aby uzyskać więcej informacji, zobacz Deklaracja zmiennej obiektu.

Wiele wystąpień

Obiekty nowo utworzone na podstawie klasy są często identyczne ze sobą. Gdy jednak istnieją one jako poszczególne obiekty, ich zmienne i właściwości można zmienić niezależnie od innych wystąpień. Jeśli na przykład dodasz trzy pola wyboru do formularza, każdy obiekt pola wyboru jest wystąpieniem CheckBox klasy. Poszczególne CheckBox obiekty mają wspólny zestaw cech i możliwości (właściwości, zmiennych, procedur i zdarzeń) zdefiniowanych przez klasę. Jednak każda z nich ma własną nazwę, może być oddzielnie włączona i wyłączona i może zostać umieszczona w innej lokalizacji w formularzu.

Elementy członkowskie obiektu

Obiekt jest elementem aplikacji reprezentującym wystąpienie klasy. Pola, właściwości, metody i zdarzenia to bloki konstrukcyjne obiektów i stanowią ich składowe.

Dostęp do elementu członkowskiego

Dostęp do elementu członkowskiego obiektu można uzyskać, określając w kolejności nazwę zmiennej obiektu, kropkę (.) i nazwę elementu członkowskiego. Poniższy przykład ustawia Text właściwość Label obiektu.

warningLabel.Text = "Data not saved"

Lista elementów członkowskich funkcji IntelliSense

Funkcja IntelliSense wyświetla elementy członkowskie klasy podczas wywoływania jej opcji Składowe listy, na przykład podczas wpisywania kropki (.) jako operatora dostępu do składowych. Jeśli wpiszesz kropkę po nazwie zmiennej zadeklarowanej jako wystąpienie tej klasy, funkcja IntelliSense wyświetla listę wszystkich elementów członkowskich wystąpienia i żaden z udostępnionych elementów członkowskich. Jeśli wpiszesz kropkę po samej nazwie klasy, funkcja IntelliSense wyświetli listę wszystkich udostępnionych elementów członkowskich i żaden z elementów członkowskich wystąpienia. Aby uzyskać więcej informacji, zobacz Using IntelliSense (Korzystanie z funkcji IntelliSense).

Pola i właściwości

Pola i właściwości reprezentują informacje przechowywane w obiekcie. Pobierasz i ustawiasz ich wartości za pomocą instrukcji przypisania w taki sam sposób, jak pobierasz i ustawiasz zmienne lokalne w procedurze. Poniższy przykład pobiera Width właściwość i ustawia ForeColor właściwość Label obiektu.

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

Należy pamiętać, że pole jest również nazywane zmienną składową.

Użyj procedur właściwości, gdy:

  • Musisz kontrolować, kiedy i jak jest ustawiana lub pobierana wartość.

  • Właściwość ma dobrze zdefiniowany zestaw wartości, które należy zweryfikować.

  • Ustawienie wartości powoduje pewne zauważalne zmiany stanu obiektu, takie jak IsVisible właściwość.

  • Ustawienie właściwości powoduje zmiany innych zmiennych wewnętrznych lub wartości innych właściwości.

  • Aby można było ustawić lub pobrać właściwość, należy wykonać zestaw kroków.

Użyj pól, gdy:

  • Wartość jest typu samoakwalidującego. Na przykład błąd lub automatyczna konwersja danych występuje, jeśli wartość inna niż True lub False jest przypisana do zmiennej Boolean .

  • Każda wartość w zakresie obsługiwanym przez typ danych jest prawidłowa. Dotyczy to wielu właściwości typu Single lub Double.

  • Właściwość jest typem String danych i nie ma żadnego ograniczenia rozmiaru ani wartości ciągu.

  • Aby uzyskać więcej informacji, zobacz Procedury właściwości.

Porada

Zawsze należy zachować prywatne pola niestałych. Jeśli chcesz udostępnić ją publicznie, użyj właściwości .

Metody

Metoda to akcja, którą obiekt może wykonać. Na przykład to metoda ComboBox obiektu, Add która dodaje nowy wpis do pola kombi.

W poniższym przykładzie pokazano Start metodę Timer obiektu.

Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()

Należy pamiętać, że metoda jest po prostu procedurą uwidocznianą przez obiekt.

Aby uzyskać więcej informacji, zobacz Procedury.

Zdarzenia

Zdarzenie to akcja rozpoznawana przez obiekt, taka jak kliknięcie myszy lub naciśnięcie klawisza, a także napisanie kodu w celu udzielenia odpowiedzi. Zdarzenia mogą wystąpić w wyniku akcji użytkownika lub kodu programu lub mogą być spowodowane przez system. Kod, który sygnalizuje zdarzenie, mówi się, że zgłasza zdarzenie i kod, który odpowiada na to zdarzenie, mówi się, że go obsłuży .

Możesz również opracowywać własne zdarzenia niestandardowe, które mają być wywoływane przez obiekty i obsługiwane przez inne obiekty. Aby uzyskać więcej informacji, zobacz Zdarzenia.

Elementy członkowskie wystąpienia i udostępnione elementy członkowskie

Podczas tworzenia obiektu na podstawie klasy wynik jest wystąpieniem tej klasy. Elementy członkowskie, które nie są deklarowane za pomocą słowa kluczowego Udostępnione , są elementami członkowskimi wystąpienia, które należą ściśle do tego konkretnego wystąpienia. Element członkowski wystąpienia w jednym wystąpieniu jest niezależny od tego samego elementu członkowskiego w innym wystąpieniu tej samej klasy. Na przykład zmienna składowa wystąpienia może mieć różne wartości w różnych wystąpieniach.

Składowe zadeklarowane za pomocą słowa kluczowego Sharedwspółużytkowane składowe, które należą do klasy jako całości, a nie do żadnego konkretnego wystąpienia. Udostępniony element członkowski istnieje tylko raz, niezależnie od liczby wystąpień utworzonej klasy, a nawet jeśli nie utworzysz żadnych wystąpień. Udostępniona zmienna składowa ma na przykład tylko jedną wartość, która jest dostępna dla wszystkich kodów, które mogą uzyskiwać dostęp do klasy.

Uzyskiwanie dostępu do nieudostępnianych członków

  1. Upewnij się, że obiekt został utworzony na podstawie klasy i przypisany do zmiennej obiektu.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. W instrukcji, która uzyskuje dostęp do elementu członkowskiego, postępuj zgodnie z nazwą zmiennej obiektu z operatorem dostępu do składowych (.), a następnie nazwą elementu członkowskiego.

    secondForm.Show()
    

Uzyskiwanie dostępu do udostępnionych członków

  • Postępuj zgodnie z nazwą klasy za pomocą operatora dostępu do składowej (.), a następnie nazwy składowej. Zawsze należy uzyskać dostęp do Shared składowej obiektu bezpośrednio za pośrednictwem nazwy klasy.

    Console.WriteLine("This computer is called " & Environment.MachineName)
    
  • Jeśli obiekt został już utworzony na podstawie klasy, możesz też uzyskać dostęp do składowej Shared za pośrednictwem zmiennej obiektu.

Różnice między klasami i modułami

Główną różnicą między klasami i modułami jest to, że klasy mogą być tworzone jako obiekty, podczas gdy moduły standardowe nie mogą. Ponieważ istnieje tylko jedna kopia danych modułu standardowego, gdy jedna część programu zmienia zmienną publiczną w module standardowym, każda inna część programu pobiera tę samą wartość, jeśli odczytuje tę zmienną. Natomiast dane obiektów istnieją oddzielnie dla każdego utworzonego obiektu. Inną różnicą jest to, że w przeciwieństwie do modułów standardowych klasy mogą implementować interfejsy. Jeśli klasa jest oznaczona modyfikatorem MustInherit , nie można utworzyć wystąpienia bezpośrednio. Jednak nadal różni się od modułu, ponieważ można go dziedziczyć, gdy moduły nie mogą być dziedziczone.

Uwaga

Shared Gdy modyfikator jest stosowany do składowej klasy, jest skojarzony z samą klasą zamiast określonego wystąpienia klasy. Dostęp do elementu członkowskiego jest uzyskiwany bezpośrednio przy użyciu nazwy klasy, tak samo jak dostęp do elementów członkowskich modułu.

Klasy i moduły używają również różnych zakresów dla ich członków. Składowe zdefiniowane w klasie są ograniczone do określonego wystąpienia klasy i istnieją tylko przez okres istnienia obiektu. Aby uzyskać dostęp do składowych klas spoza klasy, należy użyć w pełni kwalifikowanych nazw w formacie obiektu. Członek.

Z drugiej strony członkowie zadeklarowani w module są domyślnie publicznie dostępne i mogą być dostępne za pomocą dowolnego kodu, który może uzyskać dostęp do modułu. Oznacza to, że zmienne w module standardowym są skutecznie zmiennymi globalnymi, ponieważ są widoczne z dowolnego miejsca w projekcie i istnieją przez całe życie programu.

Ponowne stosowanie klas i obiektów

Obiekty umożliwiają deklarowanie zmiennych i procedur raz, a następnie ponowne użycie ich w razie potrzeby. Jeśli na przykład chcesz dodać moduł sprawdzania pisowni do aplikacji, możesz zdefiniować wszystkie zmienne i funkcje obsługi w celu zapewnienia funkcji sprawdzania pisowni. Jeśli utworzysz moduł sprawdzania pisowni jako klasę, możesz ponownie użyć go w innych aplikacjach, dodając odwołanie do skompilowanego zestawu. Jeszcze lepiej, może być w stanie zaoszczędzić sobie trochę pracy przy użyciu klasy sprawdzania pisowni, że ktoś inny już opracował.

Platforma .NET udostępnia wiele przykładów składników, które są dostępne do użycia. W poniższym przykładzie użyto TimeZone klasy w System przestrzeni nazw. TimeZone udostępnia elementy członkowskie, które umożliwiają pobieranie informacji o strefie czasowej bieżącego systemu komputerowego.

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

W poprzednim przykładzie pierwsza instrukcja Dim deklaruje zmienną obiektu typu TimeZone i przypisuje do niego TimeZone obiekt zwrócony przez CurrentTimeZone właściwość.

Relacje między obiektami

Obiekty mogą być ze sobą powiązane na kilka sposobów. Główne rodzaje relacji są hierarchiczne i zawierane.

Relacja hierarchiczna

Gdy klasy pochodzą z bardziej podstawowych klas, mówi się, że mają relację hierarchiczną. Hierarchie klas są przydatne podczas opisywania elementów, które są podtypem bardziej ogólnej klasy.

W poniższym przykładzie załóżmy, że chcesz zdefiniować specjalny rodzaj Button , który działa jak normalny Button , ale także uwidacznia metodę, która odwraca kolory pierwszego planu i tła.

Definiowanie klasy, która pochodzi z już istniejącej klasy

  1. Użyj instrukcji klasy , aby zdefiniować klasę, z której chcesz utworzyć potrzebny obiekt.

    Public Class ReversibleButton
    

    Upewnij się, że instrukcja jest zgodna End Class z ostatnim wierszem kodu w klasie. Domyślnie zintegrowane środowisko projektowe (IDE) automatycznie generuje instrukcję End Class po wprowadzeniu instrukcji Class .

  2. Postępuj zgodnie z instrukcją natychmiast za Class pomocą instrukcji Inherits. Określ klasę, z której pochodzi nowa klasa.

    Inherits System.Windows.Forms.Button
    

    Nowa klasa dziedziczy wszystkie elementy członkowskie zdefiniowane przez klasę bazową.

  3. Dodaj kod dla dodatkowych elementów członkowskich uwidacznianych przez klasę pochodną. Możesz na przykład dodać metodę, a klasa pochodna ReverseColors może wyglądać następująco:

    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
    

    Jeśli utworzysz obiekt z ReversibleButton klasy, będzie on mógł uzyskać dostęp do wszystkich składowych klasy, a także ReverseColors metody i innych nowych elementów członkowskich zdefiniowanych Button w elemecie ReversibleButton.

Klasy pochodne dziedziczą elementy członkowskie z klasy, na której są oparte, co pozwala zwiększyć złożoność w miarę postępu w hierarchii klas. Aby uzyskać więcej informacji, zobacz Podstawy dziedziczenia.

Kompilowanie kodu

Upewnij się, że kompilator może uzyskać dostęp do klasy, z której zamierzasz utworzyć nową klasę. Może to oznaczać w pełni kwalifikowaną nazwę, tak jak w poprzednim przykładzie, lub identyfikację jej przestrzeni nazw w instrukcji Import (przestrzeń nazw i typ platformy .NET). Jeśli klasa znajduje się w innym projekcie, może być konieczne dodanie odwołania do tego projektu. Aby uzyskać więcej informacji, zobacz Zarządzanie odwołaniami w projekcie.

Relacja zawierania

Innym sposobem, w jaki obiekty mogą być powiązane, jest relacja zawierania. Obiekty kontenerów logicznie hermetyzują inne obiekty. Na przykład OperatingSystem obiekt logicznie zawiera Version obiekt, który zwraca przez jego Version właściwość. Należy pamiętać, że obiekt kontenera nie zawiera fizycznie żadnego innego obiektu.

Kolekcje

Jeden konkretny typ zawierania obiektów jest reprezentowany przez kolekcje. Kolekcje to grupy podobnych obiektów, które można wyliczyć. Visual Basic obsługuje określoną składnię w elemecie Dla każdego... Następna instrukcja, która umożliwia iterowanie elementów kolekcji. Ponadto kolekcje często umożliwiają pobranie Item[] elementów przez ich indeks lub skojarzenie ich z unikatowym ciągiem. Kolekcje mogą być łatwiejsze do użycia niż tablice, ponieważ umożliwiają dodawanie lub usuwanie elementów bez używania indeksów. Ze względu na łatwość użycia kolekcje są często używane do przechowywania formularzy i kontrolek.

Wskazówki: definiowanie klas
Zawiera szczegółowy opis sposobu tworzenia klasy.

Przeciążone właściwości i metody
Przeciążone właściwości i metody

Podstawowe informacje o dziedziczeniu
Obejmuje modyfikatory dziedziczenia, zastępowanie metod i właściwości, MyClass i MyBase.

Okres istnienia obiektów: w jaki sposób obiekty są tworzone i niszczone
Omawia tworzenie i dysponowanie wystąpień klas.

Typy anonimowe
Opisuje sposób tworzenia i używania typów anonimowych, które umożliwiają tworzenie obiektów bez pisania definicji klasy dla typu danych.

Inicjatory obiektów: typy nazwane i anonimowe
Omawia inicjatory obiektów, które są używane do tworzenia wystąpień nazwanych i anonimowych typów przy użyciu pojedynczego wyrażenia.

Instrukcje: wnioskowanie nazw właściwości i typów w deklaracjach typu anonimowego
Objaśnienie sposobu wnioskowania nazw właściwości i typów w deklaracjach typów anonimowych. Zawiera przykłady pomyślnego i nieudanego wnioskowania.