Programowanie zorientowane obiektowo (C# i Visual Basic)

Wszystkie języki zarządzane w.NET Framework, takie jak Visual Basic i C#, zapewniają pełne wsparcie dla programowania obiektowego wraz z hermetyzacąi, dziedziczenime i polimorfizmem.

Hermetyzacja oznacza, że grupa powiązanych właściwości, metod i inne elementy są traktowane jako pojedyncza jednostka lub obiekt.

Dziedziczenie opisuje zdolność do tworzenia nowych klas w oparciu o istniejące klasy.

Polimorfizm oznacza możliwość posiadania wielu klas, które mogą być używane zamiennie, mimo że każda klasa implementuje te same właściwości lub metody w różny sposób.

Ten rozdział opisuje poniższe zagadnienia:

  • Klasy i obiekty

    • Członkowie klasy

      Właściwości i pola

      Metody

      Konstruktory

      Destruktory

      Zdarzenia

      Klasy zagnieżdżony

    • Modyfikatory dostępu i poziomu dostępu

    • Tworzenie wystąpienia klasy

    • Klasy i członkowie (współużytkowane)

    • Typy anonimowe

  • Dziedziczenie

    • Zastępowanie elementów członkowskich
  • Interfejsy

  • Generyczne

  • Obiekty delegowane

Klasy i obiekty

Terminy klasa i obiekt są czasami stosowane zamiennie, jednak w rzeczywistości klasy opisują typ obiektów, podczas gdy obiekty to użytkowe wystąpienia klas.Tak więc, akt tworzenia obiektu jest nazywany wystąpieniem.Korzystanie z analogii planu budowy, klasa to plan, a obiekt to budynek utworzony z tego planu budowy.

Aby zdefiniować klasę:

Class SampleClass
End Class
class SampleClass
{
}

Zarówno języka Visual Basic i C# udostępniają uproszczonej wersji klasy o nazwie struktury , które są przydatne, gdy chcesz utworzyć duże tablice obiektów i nie konieczne chcesz zużyć do tego zbyt dużej ilości pamięci.

Aby zdefiniować strukturę:

Structure SampleStructure
End Structure
struct SampleStruct
{
}

Aby uzyskać więcej informacji, zobacz:

Członkowie klasy

Każda klasa może mieć różnych Członków klasy którzy zawierają właściwości, które opisują dane klasy, metody, które definiują zachowanie klasy i wydarzenia, które zapewniają komunikację między różnych klasami i obiektami.

Właściwości i pola

Pola i właściwości reprezentują informacje zawarte w obiekcie.Pola przypominają zmienne, ponieważ można je odczytać lub ustawić bezpośrednio.

Aby zdefiniować pole obliczane:

Class SampleClass
    Public SampleField As String
End Class
Class SampleClass
{
    public string sampleField;
}

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

Zarówno C# i Visual Basic pozwalają na tworzenie prywatnego pola do przechowywania wartości właściwości lub użyć tzw. auto-wdrożonych właściwości, które tworzą to pole automatycznie w tle i ustanowiają podstawowe logiki dla procedur właściwość.

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

Class SampleClass
    Public Property SampleProperty as String
End Class
class SampleClass
{
    public int SampleProperty { get; set; }
}

Jeśli musisz wykonać kilka dodatkowych operacji odczytu i zapisu wartości właściwości, zdefiniuj pole do przechowywania wartości właściwości i zaoferuj podstawową logikę do jej przechowywania i pobierania:

Class Samplelass
    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
class SampleClass
{
    private int _sample;
    public int Sample
    {
        // Return the value stored in a field.
        get { return _sample; }
        // Store the value in the field.
        set { _sample = value; }
    }
}

Większość właściwości posiada metody lub procedury do ustawiania i pobierania wartości właściwości.Możesz jednak utworzyć właściwości tylko do odczytu lub tylko do zapisu, aby uniemożliwić ich modyfikację lub odczytanie.W języku Visual Basic można użyć słów kluczowych ReadOnly i WriteOnly.W języku programowania C#, można pominąć get lub set metody właściwości.Jednakże zarówno w języku Visual Basic, jak i i C#, właściwości zaimplementowane automatycznie nie mogą być tylko do odczytu lub tylko do zapisu.

Aby uzyskać więcej informacji, zobacz:

Metody

Metoda to działanie, którą obiekt może wykonywać.

[!UWAGA]

W języku Visual Basic, istnieją dwa sposoby tworzenia metody: instrukcja Sub jest używana, jeśli metoda nie zwraca wartości; instrukcja Function 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
class SampleClass
{
    public int sampleMethod(string sampleParam)
    {
        // Insert code here
    }
}

Klasa może mieć kilka implementacji lub przeciążenia, z tej samej metody, które różnią się liczbą typów parametru lub 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
public int sampleMethod(string sampleParam) {};
public int sampleMethod(int sampleParam) {}

W większości przypadków użytkownik deklaruje metodę w ramach definicji klasy.Jednak zarówno Visual Basic, jak i C# obsługują również metodę rozszerzającą, który umożliwia dodawanie metod do istniejącej klasy poza rzeczywistą definicją klasy.

Aby uzyskać więcej informacji, zobacz:

Konstruktory

Konstruktory są metodami klasy, które są wykonywane automatycznie po utworzeniu obiektu danego typu.Konstruktory zwykle inicjują członków danych nowego obiektu.Konstruktor można uruchomić tylko raz podczas tworzenia klasy.Ponadto kod w konstruktorze zawsze jest uruchamiany przed innymi kodami w klasie.Możesz jednak utworzyć wiele przeciążeń konstruktora 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
public class SampleClass
{
    public SampleClass()
    {
        // Add code here
    }
}

Aby uzyskać więcej informacji, zobacz:

Destruktory

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

Aby uzyskać więcej informacji dotyczących destruktorów i wyrzucania elementów bezużytecznych w .NET Framework, zobacz Wyrzucanie elementów bezużytecznych.

Zdarzenia

Zdarzenie pozwala klasie lub obiektowi powiadomić inne klasy lub obiekty, gdy stanie się coś istotnego.Klasa, która wysyła (lub generuje) zdarzenie, jest zwana wydawcą, a klasy, która otrzymują (lub obsługują) zdarzenia, są nazywane abonentami.Aby uzyskać więcej informacji dotyczących zdarzeń, ich wywoływania i obsługi, zobacz Obsługa i wywoływanie zdarzeń.

Klasy zagnieżdżony

Nosi nazwę klasy zdefiniowanej w ramach innej klasy zagnieżdżonych.Domyślnie zagnieżdżona klasa jest prywatna.

Class Container
    Class Nested
    ' Add code here.
    End Class
End Class
class Container
{
    class Nested
    {
        // Add code here.
    }
}

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

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

Modyfikatory dostępu i poziomu dostępu

Wszystkie klasy i elementy klas mogą określić poziom dostępu, jaki stanowią dla innych klas przy użyciu modyfikatory dostępu.

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

Modyfikator Visual Basic

Modyfikator C#

Definicja

Public (Visual Basic)

publiczne

Typ lub element członkowski może zostać oceniony przez każdy inny kod z tego samego zestawu lub każdy zestaw, który się do niego odwołuje.

Private (Visual Basic)

prywatne

Typ lub element członkowski może zostać oceniony jedynie przez kod z tej samej klasy.

Protected (Visual Basic)

chronione

Typ lub element członkowski może zostać oceniony jedynie przez kod z tej samej klasy lub pochodnej klasy.

Friend (Visual Basic)

wewnętrzny

Typ lub element członkowski może zostać oceniony przez każdy kod z tego samego zestawu, jednak nie z innego zestawu.

Protected Friend

protected internal

Typ lub element członkowski może zostać oceniony przez każdy kod z tego samego zestawu lub każdą pochodną klasę w innym zestawie.

Aby uzyskać więcej informacji, zobacz Poziomy dostępu w Visual Basic i Modyfikatory dostępu (Przewodnik programowania w języku C#).

Tworzenie wystąpienia klasy

Aby utworzyć obiekt, musisz utworzyć wystąpienie klasy.

Dim sampleObject as New SampleClass()
SampleClass sampleObject = new SampleClass();

Po utworzeniu wystąpienia klasy, można przypisać wartości do pól i właściwości instancji i wywołania metod klasy.

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

Aby przypisać wartość do właściwości w procesie przypadkowym klas, użyj inicjalizatorów obiektów:

Dim sampleObject = New SampleClass With 
    {.FirstProperty = "A", .SecondProperty = "B"}
// Set a property value.
SampleClass sampleObject = new SampleClass 
    { FirstProperty = "A", SecondProperty = "B" };

Aby uzyskać więcej informacji, zobacz:

Klasy i członkowie (współużytkowane)

Statycznym (udostępniony w języku Visual Basic) członkiem tej klasy jest właściwość, procedura lub pole, które są współużytkowane przez wszystkie wystąpienia klasy.

Aby zdefiniować statyczny (udostępniony) element członkowski:

Class SampleClass
    Public Shared SampleString As String = "Sample String"
End Class
static class SampleClass
{
    public static string SampleString = "Sample String";
}

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

MsgBox(SampleClass.SampleString)
Console.WriteLine(SampleClass.SampleString);

Klasy statyczne (współużytkowane) w języku C# i moduły w języku Visual Basic mają wyłącznie statycznych (współużytkowanych) członków i nie można utworzyć ich wystąpienia.Elementy statyczne (współużytkowane) również nie mają dostępu do niestatycznych (nieudostępnianych) właściwości, pól ani metod

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ę dla Ciebie.Klasa nie ma użytecznych nazw i zawiera właściwości określone w odwołaniu do 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"}
// sampleObject is an instance of a simple anonymous type.
var sampleObject = 
    new { FirstProperty = "A", SecondProperty = "B" };

Aby uzyskać więcej informacji, zobacz:

Dziedziczenie

Dziedziczenie umożliwia utworzenie nowej klasy, która używa, rozszerza i modyfikuje zachowanie, które jest zdefiniowane w innej klasy.Klasa, której członkowie są dziedziczeni, nazywa się klasą podstawową, a klasa, która dziedziczy tych członków, jest nazywana klasą wtórną.Jednakże wszystkie klasy w języku C# i Visual Basic niejawnie dziedziczą z klasy Object, która obsługuje hierarchię klas .NET i zapewnia niskopoziomowe usługi dla wszystkich klas.

[!UWAGA]

Języki zarządzane w.NET Framework nie obsługują wielokrotnego dziedziczenia, czyli można określić tylko jedną klasę podstawową dla klasy pochodnej.

Aby odziedziczyć po podstawowej klasie:

Class DerivedClass
    Inherits BaseClass
End Class
class DerivedClass:BaseClass{}

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

Aby określić, że klasa nie może być użyta jedynie jako klasa bazowa:

NotInheritable Class SampleClass
End Class
public sealed class A { }

Aby określić, że klasa może być użyta jedynie jako klasa bazowa i nie można utworzyć jej wystąpienia:

MustInherit Class BaseClass
End Class
public abstract class B { }

Aby uzyskać więcej informacji, zobacz:

Zastępowanie elementów członkowskich

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

Następujące modyfikatory są używane do kontrolowania, jak zastąpić właściwości i metody:

Modyfikator Visual Basic

Modyfikator C#

Definicja

Overridable (Visual Basic)

virtual (odwołanie w C#)

Zezwala, aby element członkowski klasy został nadpisany w klasie pochodnej.

Overrides (Visual Basic)

override (odwołanie w C#)

Zastępuje wirtualny element członkowski (przesłanialny) zdefiniowany w klasie podstawowej.

NotOverridable (Visual Basic)

Nieobsługiwane

Zapobiega nadpisaniu elementu członkowskiego w klasie dziedziczącej.

MustOverride (Visual Basic)

abstract (odwołanie w C#)

Wymaga, aby element członkowski klasy został nadpisany w klasie pochodnej.

Shadows (Visual Basic)

new — Modyfikator (odwołanie w C#)

Ukrywa członka dziedziczonego z klasy podstawowej

Interfejsy

Interfejsy, takie jak klasy, definiują zestaw właściwości, metod i zdarzeń.Ale w przeciwieństwie do klasy, interfejsy nie zapewniają implementacji.Są implementowane przez klasy i definiowane jako osobne jednostki od klas.Interfejs reprezentuje kontrakt, w którym klasa implementująca interfejs musi implementować każdy aspekt tego interfejsu, dokładnie tak, jak jest on zdefiniowany.

Aby zdefiniować interfejs:

Public Interface ISampleInterface
    Sub DoSomething()
End Interface
interface ISampleInterface
{
    void doSomething();
}

Aby zaimplementować interfejs w klasie

Class SampleClass
    Implements ISampleInterface
    Sub DoSomething
        ' Method implementation.
    End Sub
End Class
class SampleClass : ISampleInterface
{
    void ISampleInterface.doSomething()
    {
        // Method implementation.
    }
}

Aby uzyskać więcej informacji, zobacz:

Generyczne

Klasy, struktury, interfejsy i metody w.NET Framework mogą parametry typu który definiują typy obiektów, które można przechowywać lub używać.Najbardziej typowym przykładem typów ogólnych jest kolekcja, gdzie 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
Public class SampleGeneric<T> 
{
    public T Field;
}

Aby utworzyć wystąpienie klasy ogólnej:

Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
SampleGeneric<string> sampleObject = new SampleGeneric<string>();
sampleObject.Field = "Sample string";

Aby uzyskać więcej informacji, zobacz:

Obiekty delegowane

delegat jest typem, który definiuje podpis metody i można podać odwołanie do dowolnej metody przy użyciu zgodnego podpisu.Możesz wywołać metodę przez delegat.Obiekty delegowane są używane do przekazywania metod jako argumentów do innych metod.

[!UWAGA]

Programy obsługi zdarzeń to po prostu metody, które są wywoływane przez delegaty.Aby uzyskać więcej informacji dotyczących używania delegatów w obsłudze zdarzeń, zobacz Obsługa i wywoływanie zdarzeń.

Aby utworzyć delegat:

Delegate Sub SampleDelegate(ByVal str As String)
public delegate void SampleDelegate(string str);

Aby utworzyć odwołanie do metody, która pasuje do oznaczenia określonego przez delegat:

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
class SampleClass
{
    // Method that matches the SampleDelegate signature.
    public static void sampleMethod(string message)
    {
        // Add code here.
    }
    // Method that instantiates the delegate.
    void SampleDelegate()
    {
        SampleDelegate sd = sampleMethod;
        sd("Sample string");
    }
}

Aby uzyskać więcej informacji, zobacz:

Zobacz też

Koncepcje

Przewodnik programowania w języku C#

Inne zasoby

Przewodnik programowania w Visual Basic