förseglad (C#-referens)

När den tillämpas på en klass sealed förhindrar modifieraren att andra klasser ärver från den. I följande exempel ärver klassen B från klassen A, men ingen klass kan ärva från klassen B.

class A {}
sealed class B : A {}

Du kan också använda sealed modifieraren på en metod eller egenskap som åsidosätter en virtuell metod eller egenskap i en basklass. På så sätt kan du tillåta klasser att härleda från din klass och hindra dem från att åsidosätta specifika virtuella metoder eller egenskaper.

Exempel

I följande exempel Z ärver från Y men Z kan inte åsidosätta den virtuella funktion F som deklareras i X och förseglas i 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"); }
}

När du definierar nya metoder eller egenskaper i en klass kan du förhindra att härleda klasser från att åsidosätta dem genom att inte deklarera dem som virtuella.

Det är ett fel att använda den abstrakta modifieraren med en förseglad klass, eftersom en abstrakt klass måste ärvas av en klass som tillhandahåller en implementering av abstrakta metoder eller egenskaper.

När den tillämpas på en metod eller egenskap sealed måste modifieraren alltid användas med åsidosättning.

Eftersom structs är implicit förseglade kan de inte ärvas.

Mer information finns i Arv.

Fler exempel finns i Abstrakta och förseglade klasser och klassmedlemmar.

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

I föregående exempel kan du försöka ärva från den förseglade klassen med hjälp av följande instruktion:

class MyDerivedC: SealedClass {} // Error

Resultatet är ett felmeddelande:

'MyDerivedC': cannot derive from sealed type 'SealedClass'

Kommentarer

För att avgöra om du vill försegla en klass, metod eller egenskap bör du vanligtvis överväga följande två punkter:

  • De potentiella fördelarna med att härleda klasser kan få genom möjligheten att anpassa din klass.

  • Potentialen att härleda klasser kan ändra dina klasser på ett sådant sätt att de inte längre fungerar korrekt eller som förväntat.

Språkspecifikation för C#

Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även