Udostępnij za pośrednictwem


Przechowywanie wersji zastępowania i nowych słów kluczowych (Przewodnik programowania w języku C#)

Język C# jest zaprojektowany tak, aby versioning między podstawowych i klas pochodnych w różnych bibliotekach można rozwijać i zachować zgodność ze starszymi wersjami.Oznacza to, na przykład, że wprowadzenie nowego członka w bazie klasy o tej samej nazwie, jako członek klasa pochodna jest całkowicie obsługiwany przez C# i nie doprowadzić do nieoczekiwanego zachowania.Oznacza to również, że klasa musi jawnie określać, czy metoda ma na celu zastąpienie metodaodziedziczonej, lub czy metoda jest nowe metoda , która ukrywa podobnie nazwane dziedziczona metoda.

W języku C# klas pochodnych może zawierać metody z taką samą nazwę jak metod klasy podstawowej.

  • metoda klasy bazowej muszą być zdefiniowane wirtualnego.

  • Jeśli metoda w klasa pochodna nie jest poprzedzony Nowy lub zastąpić słowa kluczowe, kompilator wyda ostrzeżenie i metoda będzie działać tak, jakby new słowa kluczowego byli obecni.

  • Jeśli jest poprzedzony metoda w klasa pochodna new słowa kluczowego, metoda jest zdefiniowana jako niezależnej od metoda w klasie podstawowej.

  • Jeśli jest poprzedzony metoda w klasa pochodna override słowa kluczowego, obiekty klasa pochodna będzie wywoływać metoda zamiast metodaklasy bazowej.

  • metoda klasy bazowej może być wywołana z poziomu za pomocą klasa pochodna base słowa kluczowego.

  • override, virtual, I new słowa kluczowe można również stosować do właściwości, indeksatory i zdarzenia.

Domyślnie metody języka C# nie są wirtualne.Jeśli metoda jest zadeklarowana jako wirtualnego, każda klasa dziedziczy metoda można zaimplementować własną wersję.Aby metoda wirtualne, virtual modyfikator jest używany w deklaracji metoda klasy bazowej.klasa pochodna następnie można zastąpić wirtualnego podstawowej metoda przy użyciu override słowa kluczowego lub Ukryj wirtualna metoda w klasie bazowej za pomocą new słowa kluczowego.Jeśli ani override słowa kluczowego, ani też new podano słowa kluczowego, kompilator wygeneruje ostrzeżenie i metoda w klasa pochodna spowoduje ukrycie metoda w klasie podstawowej.

Do wykazania, to w praktyce, Przyjmijmy na chwilę utworzony w firmie a klasę o nazwie GraphicsClass, która używa programu.Oto GraphicsClass:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
}

Firma korzysta z tej klasy i użyć go do uzyskania własnej klasy dodanie nowej metoda:

class YourDerivedGraphicsClass : GraphicsClass
{
    public void DrawRectangle() { }
}

Aplikacja jest używany bez problemów, dopóki firma a wydania nowej wersji GraphicsClass, która przypomina następujący kod:

class GraphicsClass
{
    public virtual void DrawLine() { }
    public virtual void DrawPoint() { }
    public virtual void DrawRectangle() { }
}

Nowa wersja GraphicsClass zawiera teraz metoda o nazwie DrawRectangle.Początkowo nic się nie dzieje.Nowa wersja jest nadal dane binarne zgodne z starą wersję.Każde oprogramowanie, które mają być wdrażane będą nadal działać, nawet jeżeli nowa klasa jest zainstalowany w tych systemach komputerowych.Wszelkie istniejące wywołania metoda DrawRectangle będą nadal odwoływać wersji w klasa pochodna.

Jednakże, jak najszybciej ponownie skompilować aplikację przy użyciu nowej wersji GraphicsClass, otrzymasz ostrzeżenie z kompilator, CS0108.To ostrzeżenie informuje, że należy rozważyć sposób na DrawRectangle metoda zachowują się w aplikacji.

metoda umożliwia zastąpienie nowej klasy podstawowej metoda, należy użyć override słowa kluczowego:

class YourDerivedGraphicsClass : GraphicsClass
{
    public override void DrawRectangle() { }
}

override Słowa kluczowego czyni się, że wszystkie obiekty pochodzące z YourDerivedGraphicsClass będzie używać wersji klasa pochodna DrawRectangle.Obiekty pochodzące z YourDerivedGraphicsClass nadal można uzyskać dostęp do wersji klasy bazowej DrawRectangle przy użyciu podstawowego słowa kluczowego:

base.DrawRectangle();

Jeśli nie chcesz, aby metoda do zastępowania nowej klasy podstawowej metoda, stosuje się następujące uwagi.Aby uniknąć nieporozumień między dwoma metodami, można zmienić nazwę metoda.Może to być czasochłonne i podatne i nie jest praktyczne w niektórych przypadkach.Jednakże jeśli projekt jest stosunkowo niewielka, można użyć opcji kodu Visual Studiodo zmiany nazwy metoda.Aby uzyskać więcej informacji, zobacz Refaktoryzacja klas i typów (Projektant klas).

Alternatywnie, można zapobiec ostrzeżenie za pomocą słowa kluczowego new w Państwa definicji klasa pochodna :

class YourDerivedGraphicsClass : GraphicsClass
{
    public new void DrawRectangle() { }
}

Za pomocą new słowa kluczowego informuje kompilator , czy Twój definicji ukrywa definicję, która znajduje się w klasie podstawowej.Jest to zachowanie domyślne.

Zastępowanie i wybór metody

Gdy metoda nosi nazwę klasy, C# kompilator wybiera najlepszą metoda wywołanie, jeśli więcej niż jedna metoda jest zgodny z wywołania, takie jak gdy istnieją dwie metody z tej samej nazwy i parametry, które są zgodne z parametr przekazany.Następujące metody byłoby niezgodne:

public class Derived : Base
{
    public override void DoWork(int param) { }
    public void DoWork(double param) { }
}

Gdy DoWork jest wywoływana w instancji Derived, C# kompilator pierwszej próby wywołania zgodny z wersjami DoWork pierwotnie zgłoszona na Derived.Zastępowanie metody nie są uważane za zgodne z klasą, są one nowe implementacje metoda zadeklarowana w klasie podstawowej.Tylko wtedy, gdy C# kompilator nie może dopasować wywołanie metoda do oryginalnej metoda na Derived będzie spróbować dopasować wywołanie zastąpiona metoda z tej samej nazwy i parametry zgodne.Na przykład:

int val = 5;
Derived d = new Derived();
d.DoWork(val);  // Calls DoWork(double).

Ponieważ zmienna val można przekonwertować typu double niejawnie, wywołania kompilator C# DoWork(double) zamiast DoWork(int). Aby tego uniknąć na dwa sposoby.Po pierwsze należy unikać deklarowanie nowych metod z taką samą nazwę jak metod wirtualnych.Po drugie, można poinstruować C# kompilator do wywoływania wirtualnego metoda przez nadanie mu wyszukiwanie listy metoda klasy bazowej przez Rzutowanie instancji z Derived do Base.Ponieważ wirtualne, metoda wykonania DoWork(int) na Derived zostanie wywołana.Na przykład:

((Base)d).DoWork(val);  // Calls DoWork(int) on Derived.

Aby uzyskać więcej przykładów new i override, zobacz Użycie zastępowania i nowych słów kluczowych (Przewodnik programowania w języku C#).

Zobacz też

Informacje

Klasy i struktury (Przewodnik programowania w języku C#)

Metody (Przewodnik programowania w języku C#)

Dziedziczenie (Przewodnik programowania w języku C#)

Koncepcje

Przewodnik programowania w języku C#