Megosztás a következőn keresztül:


Absztrakt és lezárt osztályok és osztálytagok (C# programozási útmutató)

Az absztrakt kulcsszóval olyan osztályokat és osztálytagokat hozhat létre, amelyek hiányosak, és egy származtatott osztályban kell implementálva lenniük.

A lezárt kulcsszó lehetővé teszi, hogy megakadályozza egy osztály vagy bizonyos, korábban virtuálisként megjelölt osztálytagok öröklését.

Absztrakt osztályok és osztálytagok

Az osztályok absztraktként deklarálhatók úgy, hogy a kulcsszót abstract az osztálydefiníció elé helyezik. Példa:

public abstract class A
{
    // Class members here.
}

Absztrakt osztály nem hozható létre. Az absztrakt osztály célja egy olyan alaposztály közös definíciójának biztosítása, amelyet több származtatott osztály is megoszthat. Az osztálytárak meghatározhatnak például egy absztrakt osztályt, amelyet számos függvény paramétereként használnak, és megkövetelik, hogy a kódtárat használó programozók egy származtatott osztály létrehozásával biztosíthassák az osztály saját implementációját.

Az absztrakt osztályok absztrakt metódusokat is meghatározhatnak. Ezt úgy érheti el, hogy hozzáadja a kulcsszót abstract a metódus visszatérési típusa előtt. Példa:

public abstract class A
{
    public abstract void DoWork(int i);
}

Az absztrakt metódusoknak nincs implementációjuk, ezért a metódusdefiníciót a normál metódusblokk helyett pontosvessző követi. Az absztrakt osztály származtatott osztályainak minden absztrakt metódust implementálniuk kell. Ha egy absztrakt osztály örököl egy virtuális metódust egy alaposztálytól, az absztrakt osztály felülírhatja a virtuális metódust egy absztrakt metódussal. Példa:

// compile with: -target:library
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

Ha egy virtual metódus deklarálva abstractvan, akkor is virtuális az absztrakt osztálytól öröklő bármely osztály számára. Az absztrakt metódust öröklő osztályok nem férhetnek hozzá a metódus eredeti implementációihoz – az előző példában DoWork az F osztály nem tudja meghívni DoWork a D osztályt. Ily módon az absztrakt osztályok kényszeríthetik a származtatott osztályokat, hogy új metódus-implementációkat biztosítsanak a virtuális metódusokhoz.

Lezárt osztályok és osztálytagok

Az osztályok lezártként deklarálhatók úgy, hogy a kulcsszót sealed az osztálydefiníció elé helyezik. Példa:

public sealed class D
{
    // Class members here.
}

A lezárt osztály nem használható alaposztályként. Ezért nem lehet absztrakt osztály sem. A lezárt osztályok megakadályozzák a származtatást. Mivel ezek soha nem használhatók alaposztályként, egyes futásidejű optimalizálásokkal a lezárt osztálytagok hívása valamivel gyorsabb lehet.

Az alaposztály virtuális tagját felülíró származtatott osztály metódusa, indexelője, tulajdonsága vagy eseménye lezártként deklarálhatja ezt a tagot. Ez minden további származtatott osztály esetében tagadja a tag virtuális aspektusát. Ez úgy érhető el, hogy a kulcsszót a sealed felülbírálási kulcsszó elé helyezi az osztálytag-deklarációban. Példa:

public class D : C
{
    public sealed override void DoWork() { }
}

Lásd még