Abstraktní a uzavřené třídy a jejich členové (Průvodce programováním v C#)
Klíčové slovo abstract umožňuje vytvářet třídy a členy třídy , které jsou neúplné a které musí být implementovány v odvozené třídě.
Klíčové slovo sealed umožňuje zabránit dědění třídy nebo určitých členů třídy, které byly dříve označeny jako virtuální.
Abstraktní třídy a členy třídy
Třídy lze deklarovat jako abstraktní vložením klíčového slova abstract před definici třídy. Příklad:
public abstract class A
{
// Class members here.
}
Nelze vytvořit instanci abstraktní třídy. Účelem abstraktní třídy je poskytnutí společné definice základní třídy, kterou může sdílet více odvozených tříd. Knihovna tříd může například definovat abstraktní třídu, která se používá jako parametr pro mnoho jeho funkcí, a vyžadovat programátory, kteří používají tuto knihovnu k poskytnutí vlastní implementace třídy vytvořením odvozené třídy.
Abstraktní třídy mohou také definovat abstraktní metody. To je dosaženo přidáním klíčového slova abstract před návratový typ metody. Příklad:
public abstract class A
{
public abstract void DoWork(int i);
}
Abstraktní metody nemají žádnou implementaci, proto je jako definice metody následován středníkem namísto bloku normální metody. Odvozené třídy abstraktní třídy musí implementovat všechny abstraktní metody. Pokud abstraktní třída dědí virtuální metodu ze základní třídy, abstraktní třída může přepsat virtuální metodu abstraktní metodou. Příklad:
// compile with: -target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}
Je-li virtual metoda deklarována abstract , je stále virtuální pro jakoukoliv třídu, která dědí z abstraktní třídy. Třída, která dědí abstraktní metodu, nemůže získat přístup k původní implementaci metody – v předchozím příkladu DoWork u třídy F nemůže volat DoWork na třídu D. Tímto způsobem abstraktní třída může vynutit odvozené třídy, aby poskytovala nové implementace metod pro virtuální metody.
Zapečetěné třídy a členy třídy
Třídy lze deklarovat jako zapečetěné vložením klíčového slova sealed před definici třídy. Příklad:
public sealed class D
{
// Class members here.
}
Zapečetěná třída se nedá použít jako základní třída. Z tohoto důvodu nemůže být zároveň abstraktní třídou. Zapečetěné třídy brání odvození. Vzhledem k tomu, že je nelze nikdy použít jako základní třídu, mohou některé optimalizace za běhu volat členy zapečetěné třídy trochu rychleji.
Metoda, indexer, vlastnost nebo událost v odvozené třídě, která přepisuje virtuální člen základní třídy, může deklarovat tento člen jako zapečetěný. Tato negace je virtuální aspekt člena pro jakoukoliv další odvozenou třídu. To je dosaženo vložením sealed klíčového slova před klíčové slovo override v deklaraci člena třídy. Příklad:
public class D : C
{
public sealed override void DoWork() { }
}