Udostępnij za pośrednictwem


Polimorfizm (Podręcznik programowania C#)

Polimorfizm jest często nazywane trzeciego filaru Programowanie zorientowane obiektowo po hermetyzacji i dziedziczenia.Polimorfizm to greckie wyraz, który oznacza "kształcie wielu" i ma dwa różne aspekty:

  1. W czasie wykonywania obiekty pochodne klasy może być traktowana jako obiekty klasy podstawowej w miejscach takich jak parametry metody i kolekcje lub tablic.W takim przypadku deklarowanego typu obiektu nie jest już identyczny z typów w czasie wykonywania.

  2. Klas podstawowych może być zdefiniowanie i wdrożenie wirtualnegometody, i można klas pochodnych zastąpić je, które oznacza udostępniają swoje własne definicji i wdrażania.W czasie wykonywania gdy klient kod wywołuje metodę, środowisko CLR wyszukuje typu run-time obiektu i wywołuje ten override metoda wirtualna.Zatem w kodzie źródłowym wywołania metody w klasie podstawowej i spowodować, że wersja klasy dziedziczącej metody, które mają być wykonane.

Metod wirtualnych umożliwiają pracę z grupy obiekty powiązane w jednolity sposób.Na przykład załóżmy, że masz aplikacji do rysowania, który umożliwia użytkownikowi tworzenie różnego rodzaju kształtów na rysunku powierzchni.Nie wiadomo w czasie kompilacji jakie rodzaje kształtów zostanie utworzony przez użytkownika.Aplikacja ma do śledzenia różnych typów kształtów, które są tworzone i należy je aktualizować w odpowiedzi na działanie myszy użytkownika.Polimorfizm można użyć, aby rozwiązać ten problem, w dwóch etapach:

  1. Tworzenie hierarchii klasy, w którym każda określonego kształtu klasa pochodzi od wspólnej klasy bazowej.

  2. Metoda wirtualnego umożliwia wywoływanie odpowiedniej metody, na dowolnej klasy pochodnej poprzez pojedyncze wywołanie metody klasy bazowej.

Najpierw należy utworzyć klasy podstawowej o nazwie Shapei klasy pochodne takich jak Rectangle, Circle, i Triangle.Nadaj Shape klasy metoda wirtualna o nazwie Draw, i zastąpienie go w każdej klasie pochodnej, aby narysować szczególne, kształt klasy reprezentuje.Tworzenie List<Shape> obiektu i dodać okrąg, trójkąt i prostokąt do niego.Aby zaktualizować powierzchni rysunku, użyj foreach iterujemy na liście, a wywołanie Draw metody na każdym Shape obiektu na liście.Mimo, że każdy obiekt na liście ma deklarowanych typu Shape, jest typu run-time (zastąpiona wersja metody w każdej klasie pochodnej), który zostanie wywołany.

public class Shape
{
    // A few example members
    public int X { get; private set; }
    public int Y { get; private set; }
    public int Height { get; set; }
    public int Width { get; set; }

    // Virtual method
    public virtual void Draw()
    {
        Console.WriteLine("Performing base class drawing tasks");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        // Code to draw a circle...
        Console.WriteLine("Drawing a circle");
        base.Draw();
    }
}
class Rectangle : Shape
{
    public override void Draw()
    {
        // Code to draw a rectangle...
        Console.WriteLine("Drawing a rectangle");
        base.Draw();
    }
}
class Triangle : Shape
{
    public override void Draw()
    {
        // Code to draw a triangle...
        Console.WriteLine("Drawing a triangle");
        base.Draw();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Polymorphism at work #1: a Rectangle, Triangle and Circle
        // can all be used whereever a Shape is expected. No cast is
        // required because an implicit conversion exists from a derived 
        // class to its base class.
        System.Collections.Generic.List<Shape> shapes = new System.Collections.Generic.List<Shape>();
        shapes.Add(new Rectangle());
        shapes.Add(new Triangle());
        shapes.Add(new Circle());

        // Polymorphism at work #2: the virtual method Draw is
        // invoked on each of the derived classes, not the base class.
        foreach (Shape s in shapes)
        {
            s.Draw();
        }

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

}

/* Output:
    Drawing a rectangle
    Performing base class drawing tasks
    Drawing a triangle
    Performing base class drawing tasks
    Drawing a circle
    Performing base class drawing tasks
 */

W C# polimorficzna jest każdego typu, ponieważ dziedziczą wszystkich typów, włączając typy zdefiniowane przez użytkownika, Object.

Polimorfizm, omówienie

ms173152.collapse_all(pl-pl,VS.110).gifCzłonkowie wirtualnego

Klasa pochodna dziedziczy z klasy bazowej, uzyskuje się wszystkich metod, pól, właściwości i zdarzeń klasy podstawowej.Projektant klasy pochodnej można wybrać czy

  • zastąpić Członkowie wirtualnego w klasie podstawowej

  • dziedziczą najbliższy metoda klasy bazowej bez zastępowania go

  • Definiowanie nowych-wirtualny wykonania tych członków, którzy ukryć implementacje klasy podstawowej

Klasy pochodnej można zastąpić członek klasy podstawowej, tylko wtedy, gdy członek klasy podstawowej jest zadeklarowana jako wirtualnego lubabstrakcyjna.Członek pochodnej należy użyć zastąpić słowo kluczowe, aby wyraźnie wskazują, że metoda jest przeznaczony do udziału w wirtualnych wywołania.Poniższy kod zawiera przykład:

public class BaseClass
{
    public virtual void DoWork() { }
    public virtual int WorkProperty
    {
        get { return 0; }
    }
}
public class DerivedClass : BaseClass
{
    public override void DoWork() { }
    public override int WorkProperty
    {
        get { return 0; }
    }
}

Pola nie może być wirtualnych; tylko metody, właściwości, zdarzenia i indeksatory może być wirtualnych.Klasy pochodne zastępuje członka wirtualnego, członek ten jest nazywany nawet wtedy, gdy wystąpienie tej klasy jest dostępny jako instancja klasy podstawowej.Poniższy kod zawiera przykład:

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Also calls the new method.

Właściwości i metod wirtualnych umożliwiają klas pochodnych rozszerzenie klasy podstawowej, bez konieczności użyć implementacji klasy podstawowej metody.Aby uzyskać więcej informacji, zobacz Przechowywanie wersji z Override i nowe słowa kluczowe (Podręcznik programowania C#).Interfejs udostępnia inny sposób, aby zdefiniować metody lub zestaw metod, którego realizacja pozostawia się do klas pochodnych.Aby uzyskać więcej informacji, zobacz Interfejsy (Podręcznik programowania C#).

ms173152.collapse_all(pl-pl,VS.110).gifUkrywanie członkowie klasy podstawowej z nowych członków

Jeśli chcesz pochodnych elementów członkowskich mają taką samą nazwę jak członka w klasie podstawowej, ale nie chcesz, aby go do udziału w wirtualnych wywołania, można użyć Nowy słowa kluczowego.new Słowo kluczowe jest umieszczone przed zwracany typ członka klasy, który jest zastępowany.Poniższy kod zawiera przykład:

public class BaseClass
{
    public void DoWork() { WorkField++; }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { WorkField++; }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}

Członkowie klasy bazowej ukryte nadal są dostępne z kod klienta przez Rzutowanie instancji klasy pochodnej do instancji klasy bazowej.Na przykład:

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Calls the old method.

ms173152.collapse_all(pl-pl,VS.110).gifUniemożliwia przesłanianie Członkowie wirtualnego klas pochodnych

Członkowie wirtualnego nadal wirtualnych przez czas nieokreślony, niezależnie od liczby klas zostały zgłoszone między członkiem wirtualnym i klasy, która pierwotnie zadeklarowana jako.Jeśli klasy deklaruje członka wirtualnego i klasa b pochodzi od a i klasy c pochodzi od B-C klasa dziedziczy członka wirtualnego i ma możliwość je zastąpić, niezależnie od tego, czy klasa b zadeklarowanych jako przesłonięcie formatowania dla tego członka.Poniższy kod zawiera przykład:

public class A
{
    public virtual void DoWork() { }
}
public class B : A
{
    public override void DoWork() { }
}

Klasa pochodna można zatrzymać dziedziczenie wirtualnego oświadczając przesłonięcie jako zamkniętych.Wymaga to wprowadzenia sealed słowa kluczowego przed override słowa kluczowego w deklaracji członka klasy.Poniższy kod zawiera przykład:

public class C : B
{
    public sealed override void DoWork() { }
}

W poprzednim przykładzie, Metoda DoWork nie jest już wirtualnego dla każdej klasy pochodne C.Jest nadal wirtualnego dla wystąpień C, nawet jeśli są one oddane do typu b lub typu A.Metody zamkniętych może być zastąpione przez klas pochodnych przy użyciu new słowa kluczowego, jak pokazano w następującym przykładzie:

public class D : C
{
    public new void DoWork() { }
}

W przypadku jeśli DoWork wywoływana jest zmienną typu D, D nowych DoWork jest wywoływana.Jeśli zmienna typu C, B lub a umożliwiające dostęp do wystąpienia D, wywołanie do DoWork będą przestrzegać reguł wirtualnego dziedziczenia, routing wywołań do wprowadzania w życie DoWork na klasy C.

ms173152.collapse_all(pl-pl,VS.110).gifUzyskiwanie dostępu do klasy podstawowej Członkowie wirtualnego z klas pochodnych

Pochodna klasy, która ma zastąpić lub zastąpiona metoda lub właściwość nadal można uzyskać dostęp, metody lub właściwości w klasie bazowej za pomocą bazowego słowa kluczowego.Poniższy kod zawiera przykład:

public class Base
{
    public virtual void DoWork() {/*...*/ }
}
public class Derived : Base
{
    public override void DoWork()
    {
        //Perform Derived's work here
        //...
        // Call DoWork on base class
        base.DoWork();
    }
}

Aby uzyskać więcej informacji, zobacz podstawowych.

[!UWAGA]

Zaleca się, że Członkowie wirtualnego za pomocą base do wywołania implementacji klasy podstawowej tego członka w celu ich wykonania.Najmu wystąpić umożliwia w klasie pochodnej skoncentrować się na zachowanie klasy podstawowej wykonawczych zachowanie specyficzne dla klasy pochodnej.Jeśli nie zostanie wywołana implementacji klasy podstawowej, jest do odziedziczonej klasy, aby ich zachowanie zgodne z zachowaniem klasy podstawowej.

W tej sekcji

Zobacz też

Informacje

Dziedziczenie (Podręcznik programowania C#)

Klasy abstrakcyjne i zamkniętych i elementy klas (Podręcznik programowania C#)

Metody (Podręcznik programowania C#)

Zdarzenia (Podręcznik programowania C#)

Właściwości (Podręcznik programowania C#)

Indeksatory (Podręcznik programowania C#)

Typy (Podręcznik programowania C#)

Koncepcje

Podręcznik programowania C#

Podręcznik programowania C#