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:
Język Visual Basic
C#
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:
Język Visual Basic
C#
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:
Język Visual Basic
C#
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:
Język Visual Basic
C#
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ń.
Język Visual Basic
Aby zadeklarować zdarzenie, użyj Event — Instrukcja.
Aby wywołać zdarzenia, użyj RaiseEvent — Instrukcja.
Aby określić obsługę zdarzenia przy użyciu sposobu orzekającego, użyj WithEvents (Visual Basic) instrukcji i klauzuli Handles — Klauzula (Visual Basic).
Aby mieć możliwość dynamicznego dodawania i zmiany obsługi zdarzenia powiązanego ze zdarzeniem, użyj AddHandler — Instrukcja i RemoveHandler — Instrukcja razem z AddressOf — Operator (Visual Basic).
C#
Aby zadeklarować zdarzenia w klasie, użyj słowa kluczowego event (odwołanie w C#).
Aby wywołać zdarzenie, wywołaj delegat wydarzenia.
Aby subskrybować zdarzenie, użyj operatora +=, aby anulować subskrypcję zdarzenia, użyj operatora -=.
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 |
---|---|---|
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. |
||
Typ lub element członkowski może zostać oceniony jedynie przez kod z tej samej klasy. |
||
Typ lub element członkowski może zostać oceniony jedynie przez kod z tej samej klasy lub pochodnej klasy. |
||
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:
Język Visual Basic
C#
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:
Język Visual Basic
C#
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:
Język Visual Basic: Typy anonimowe (Visual Basic)
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:
Język Visual Basic
C#
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 |
---|---|---|
Zezwala, aby element członkowski klasy został nadpisany w klasie pochodnej. |
||
Zastępuje wirtualny element członkowski (przesłanialny) zdefiniowany w klasie podstawowej. |
||
Nieobsługiwane |
Zapobiega nadpisaniu elementu członkowskiego w klasie dziedziczącej. |
|
Wymaga, aby element członkowski klasy został nadpisany w klasie pochodnej. |
||
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:
Język Visual Basic
C#
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:
Język Visual Basic
C#
Zobacz też
Koncepcje
Przewodnik programowania w języku C#