lezárt (C# referencia)

Ha egy osztályra alkalmazza a sealed módosítót, az megakadályozza, hogy más osztályok örököljenek az adott osztályból. Az alábbi példában az B osztály az Aosztálytól örököl, de egyetlen osztály sem örökölhet Bosztályból.

class A {}
sealed class B : A {}

A sealed módosító olyan metóduson vagy tulajdonságon is használható, amely felülbírál egy virtuális metódust vagy tulajdonságot egy alaposztályban. Ezzel a megközelítéssel lehetővé teszi a fejlesztők számára, hogy osztályokat nyerjenek az osztályból, miközben megakadályozzák, hogy felülírjanak bizonyos virtuális módszereket vagy tulajdonságokat.

A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.

A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.

Jótanács

Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.

Az alábbi példában a rendszer örökli a virtuális függvényt, Z de Z nem tudja felülbírálni a deklarált X és lezárt virtuális függvényt FY.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"); }
}

Ha új metódusokat vagy tulajdonságokat határoz meg egy osztályban, megakadályozhatja, hogy a származtatott osztályok felülírják őket, ha nem deklarálja őket virtuális. Ha felülbírál egy virtual alaptípusban deklarált tagot, megakadályozhatja, hogy a származtatott típusok felülbírálják azt a kulcsszó használatával, sealed ahogyan az az alábbi példában látható:

public sealed override string ToString() => Value;

Hiba az absztrakciós módosító zárt osztálysal való használata, mert az absztrakt osztályt egy olyan osztálynak kell örökölnie, amely biztosítja az absztrakt metódusok vagy tulajdonságok implementálását.

Amikor egy metódusra vagy tulajdonságra alkalmazza a sealed módosítót, mindig használja felülbírálással.

Mivel a szerkezetek implicit módon vannak lezárva, nem örökölhet tőlük.

További információ: Öröklés.

További példákért lásd absztrakt és lezárt osztályok és osztálytagok.

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

Az előző példában az alábbi utasítással megpróbálhatja örökölni a lezárt osztályt:

class MyDerivedC: SealedClass {} // Error

Az eredmény egy hibaüzenet:

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

Annak megállapításához, hogy osztályt, metódust vagy tulajdonságot szeretne-e lezárni, általában vegye figyelembe a következő két pontot:

  • A származtatott osztályok számára elérhető potenciális előnyök, amelyeket az osztály testreszabásának képessége nyújthat.
  • Az osztályok származtatásának lehetősége úgy módosíthatja az osztályokat, hogy azok már nem működnek megfelelően vagy a várt módon.

C# nyelvspecifikáció

További információ: C# nyelvi specifikáció. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még: