sealed (Referenční příručka C#)
Při použití na třídu sealed
modifikátor zabraňuje ostatním třídám dědit z ní. V následujícím příkladu třída B
dědí z třídy A
, ale žádná třída nemůže dědit z třídy B
.
class A {}
sealed class B : A {}
Můžete také použít modifikátor sealed
u metody nebo vlastnosti, která přepíše virtuální metodu nebo vlastnost v základní třídě. To vám umožní, aby třídy odvozovaly z vaší třídy a zabránily jim v přepsání konkrétních virtuálních metod nebo vlastností.
Příklad
V následujícím příkladu Z
dědí z Y
, ale Z
nemůže přepsat virtuální funkci F
, která je deklarována v X
a zapečetěna v Y
.
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
Při definování nových metod nebo vlastností ve třídě můžete zabránit odvozeným třídám, aby je přepsaly tím, že je nedeklarujete jako virtuální.
Když přepíšete virtual
člen deklarovaný v základním typu, můžete zabránit odvozeným typům v jejich přepsání pomocí klíčového slova sealed, například takto:
public sealed override string ToString() => Value;
Jedná se o chybu použití abstraktního modifikátoru s zapečetěnou třídou, protože abstraktní třída musí být zděděna třídou, která poskytuje implementaci abstraktních metod nebo vlastností.
Při použití u metody nebo vlastnosti musí být modifikátor sealed
vždy použit s přepsání.
Vzhledem k tomu, že struktury jsou implicitně zapečetěné, nelze je zdědit.
Další informace naleznete v tématu dědičnost.
Další příklady najdete v tématu abstraktní a zapečetěné třídy a členy třídy.
sealed class SealedClass
{
public int x;
public int y;
}
class SealedTest2
{
static void Main()
{
var sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine($"x = {sc.x}, y = {sc.y}");
}
}
// Output: x = 110, y = 150
V předchozím příkladu se můžete pokusit zdědit z zapečetěné třídy pomocí následujícího příkazu:
class MyDerivedC: SealedClass {} // Error
Výsledkem je chybová zpráva:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Poznámky
Pokud chcete určit, zda chcete zapečetit třídu, metodu nebo vlastnost, měli byste obecně zvážit následující dva body:
Potenciální výhody, které odvozené třídy mohou získat díky schopnosti přizpůsobit třídu.
Možnost, že by odvozené třídy mohly upravit vaše třídy takovým způsobem, že by již nefungovaly správně nebo podle očekávání.
Specifikace jazyka C#
Další informace najdete ve specifikaci jazyka C# . Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.
Viz také
- Klíčová slova C#
- statické třídy a členy statické třídy
- abstraktní a zapečetěné třídy a členy třídy
- modifikátory přístupu
- modifikátory
- přepsání
- virtuální