Sdílet prostřednictvím


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é