sealed (Referenční dokumentace jazyka C#)
Při použití na třídu sealed
modifikátor zabraňuje jiným třídám v dědění 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 {}
Modifikátor můžete použít sealed
také 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 dědí z, Z
ale Z
nemůže přepsat virtuální funkciF
, která je deklarována X
a zapečetěna v Y
.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"); }
}
Když definujete nové metody nebo vlastnosti ve třídě, můžete zabránit odvození tříd v jejich přepsání tím, že je nedeklakla jako virtuální.
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 sealed
musí být modifikátor vždy použit s přepsání.
Vzhledem k tomu, že struktury jsou implicitně zapečetěné, nelze je zdědit.
Další informace najdete 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 odvozené třídy mohou získat prostřednictvím možnosti přizpůsobit vaši třídu.
Potenciál odvozených tříd by mohl 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 v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.