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#)