Abstraktní a uzavřené třídy a jejich členové (Průvodce programováním v C#)
Abstraktní klíčové slovo umožňuje vytvářet třídy a členy třídy, které jsou neúplné a musí být implementovány v odvozené třídě.
Zapečetěné klíčové slovo umožňuje zabránit dědičnosti 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í zadáním klíčového slova abstract
před definici třídy. Příklad:
public abstract class A
{
// Class members here.
}
Abstraktní třídu nelze vytvořit instanci. Účelem abstraktní třídy je poskytnout společnou definici 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 mnoha jeho funkcí, a vyžadovat programátory, kteří tuto knihovnu používají, aby poskytli vlastní implementaci třídy vytvořením odvozené třídy.
Abstraktní třídy mohou také definovat abstraktní metody. Toho lze dosáhnout 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, takže za definicí metody následuje středník místo normálního bloku metody. Odvozené třídy abstraktní třídy musí implementovat všechny abstraktní metody. Když 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.
}
}
virtual
Pokud je metoda deklarována abstract
, je stále virtuální pro všechny třídy dědění 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
třídy F nemůže volat DoWork
třídu D. Abstraktní třída tak může vynutit odvozené třídy, aby poskytovaly 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ěnou třídu nelze použít jako základní třídu. Z tohoto důvodu nemůže být také abstraktní třídou. Zapečetěné třídy brání odvození. Protože se nikdy nedají použít jako základní třída, některé optimalizace za běhu můžou volat zapečetěné členy 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ý. Tím se neguje virtuální aspekt člena pro jakoukoli další odvozenou třídu. Toho dosáhnete tak, že do deklarace člena třídy umístíte sealed
klíčové slovo před klíčové slovo přepsání . Příklad:
public class D : C
{
public sealed override void DoWork() { }
}