Sdílet prostřednictvím


Správa verzí s přepsat a nová klíčová slova (Příručka programování C#)

Jazyk C# je navržen tak, aby verzí mezi základní a odvozené třídy v různých knihovnách můžete vyvíjet a zachování zpětné kompatibility.To například znamená, že zavedení nového člena v základní třída se stejným názvem jako člen v odvozené třída jsou plně podporovány C# a nevede k neočekávanému chování.Také znamená, že třída musí být výslovně uvedena zda metoda je určena přepsat zděděné metodanebo zda metoda je nová metoda , která skryje podobně pojmenovanými zděděné metoda.

V jazyce C# může obsahovat odvozené třídy metody se stejným názvem jako metody základní třída .

  • Základní třídametoda musí být definována virtuální.

  • Pokud není metoda odvozené třída předchází nové nebo přepsat klíčová slova, kompilátor bude vydávat upozornění a metoda se bude chovat jako new klíčové slovo , které nebyly nalezeny.

  • Pokud je metoda odvozené třída před new klíčové slovo, metoda je definována jako nezávislá metoda v základní třída.

  • Pokud je metoda odvozené třída před override klíčové slovo, objekty odvozené třída bude volat metoda namístometodazákladní třída.

  • Základní třídametoda lze volat z uvnitř odvozené třída pomocí base klíčové slovo.

  • override, virtual, A new klíčová slova lze také použít vlastnosti, indexování a události.

Standardně nejsou virtuální metody C#.Pokud metoda je deklarována jako virtuální, třída dědí metoda lze implementovat vlastní verze.metoda vytvoření virtuální, virtual modifikátoru v deklaraci metoda základní třída.Odvozené třída pak můžete přepsat základní metoda virtuální pomocí override klíčové slovo nebo skrýt virtuální metoda základní třída pomocí new klíčové slovo. Pokud ani override klíčové slovo ani newzadané klíčové slovo , kompilátor bude vydávat upozornění a metoda odvozené třída bude skrýt metoda v základní třída.

V praxi ukazuje to předpokládá na chvíli, že firmy a vytvořil třída s názvem GraphicsClass, který program používá.Je GraphicsClass:

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

Společnost používá třídaa použít k odvození vlastní třída, přidání nové metoda:

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

aplikace používá bez problémů, dokud firmy a vydání nové verze GraphicsClass, která se podobá následující kód:

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

Nová verze GraphicsClass nyní obsahuje metoda pojmenovanou DrawRectangle.Zpočátku nedojde k.Nová verze je stále binary kompatibilní s původní verze.Zavedení softwaru bude pokračovat v práci, i v případě, že je v těchto systémů v počítači nainstalována nová třída .Existující volání metoda DrawRectangle bude nadále odkazovat se verze, v odvozené třída.

Ale jakmile znovu zkompilujte aplikace s použitím nové verze GraphicsClass, obdržíte upozornění z kompilátor, CS0108.Toto upozornění informuje, je nutné zvážit, jak chcete vaše DrawRectangle metoda chování aplikace.

metoda přepsat nové základní třídametoda, použít override klíčové slovo:

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

override klíčové slovo zajišťuje, že všechny objekty odvozené z YourDerivedGraphicsClass používat odvozené třídaverze DrawRectangle. Objekty odvozené z YourDerivedGraphicsClass stále přístup základní třídaverze DrawRectangle pomocí základní klíčové slovo:

base.DrawRectangle();

Pokud nechcete, aby metoda přepsat nové základní třída metoda, následující důležité informace o párovat.Chcete-li zabránit záměně mezi dvěma metodami, můžete přejmenovat metoda.Může být časově náročné a chyba-náchylné a v některých případech právě není praktické.Však pokud projekt je relativně malá, můžete Visual StudioRefactoring možnosti přejmenování metoda.Další informace naleznete v tématu Optimalizace struktury programu třídy a typy (třídy Designer).

Můžete také zabránit upozornění pomocí klíčové slovo new ve své definici odvozené třída :

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

Použití new klíčové slovo říká kompilátor , aby vaše definice skryje definice obsažené v základní třída. Toto je výchozí chování.

Přepsat a metodu výběru

Pokud metoda s názvem třída, C# kompilátor vybere nejlepší metoda volání, je-li více než jednu metoda je kompatibilní s volání, například když se stejným názvem a parametry, které jsou kompatibilní s parametr předaný dvěma způsoby.Následující metody by kompatibilní:

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

Při DoWork se nazývá instance Derived, C# kompilátor se nejprve pokusí volání kompatibilní s verzemi DoWork původně deklarováno na Derived.Přepsání metody nejsou považována deklaraci třída, jsou nové implementace metoda deklarované v základní třída.Pouze v případě, že C# kompilátor nemůže odpovídat volání metoda původní metoda na Derived se pokusí odpovídají volání Potlačená metoda se stejným názvem a kompatibilní parametry.Příklad:

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

Protože proměnná val lze převést na dvojitou implicitně, volání kompilátor C# DoWork(double) namísto DoWork(int). Existují dva způsoby, jak se vyhnout.Nejprve se vyhnout deklarování nových metod se stejným názvem jako virtuální metody.Za druhé, dáte pokyn C# kompilátor volání virtuální metoda tím, že hledání seznamumetoda základní třídapodle obsazení instance Derived na Base. Protože metoda je virtuální, provádění DoWork(int) na Derived bude volána.Příklad:

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

Další příklady new a override, viz Víte, kdy použít přepsat a nová klíčová slova (C# Příručka programování).

Viz také

Referenční dokumentace

Třídy a struktur (Příručka programování C#)

Metody (Příručka programování C#)

Dědičnost (Příručka programování C#)

Koncepty

Příručka programování C#