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


Interfészek – több típus viselkedésének definiálása

Az interfész definíciókat tartalmaz a nem absztrakt class vagy implementálandó kapcsolódó funkciók egy csoportjához struct . Az interfészek meghatározhatnak static metódusokat, amelyeknek implementációval kell rendelkezniük. Egy felület meghatározhat egy alapértelmezett implementációt a tagok számára. Az interfészek nem deklarálhatnak példányadatokat, például mezőket, automatikusan implementált tulajdonságokat vagy tulajdonságszerű eseményeket.

A felületek használatával például több forrásból származó viselkedést is belefoglalhat egy osztályba. Ez a képesség fontos a C#-ban, mert a nyelv nem támogatja az osztályok több öröklését. Emellett egy interfészt is használnia kell, ha a szerkezetek öröklését szeretné szimulálni, mert azok valójában nem örökölhetők egy másik struktúra vagy osztály alapján.

Az alábbi példa szerint a interface kulcsszóval definiálhat egy felületet.

interface IEquatable<T>
{
    bool Equals(T obj);
}

Az illesztő nevének érvényes C# azonosítónévnek kell lennie. Konvenció szerint a felületnevek nagybetűvel Ikezdődnek.

Az interfészt megvalósító IEquatable<T> osztálynak vagy szerkezetnek tartalmaznia kell egy olyan metódus definícióját Equals , amely megfelel az interfész által megadott aláírásnak. Ennek eredményeképpen számíthat egy olyan osztályra, amely olyan metódust implementál IEquatable<T>Equals , amellyel az osztály egy példánya meghatározhatja, hogy egyenlő-e ugyanannak az osztálynak egy másik példányával.

A definíció IEquatable<T> nem biztosít implementációt a következőhöz Equals: . Egy osztály vagy struktúra több interfészt is képes implementálni, de az osztály csak egyetlen osztálytól örökölhet.

Az absztrakt osztályokról további információt az Absztrakt és a Lezárt osztályok és osztálytagok című témakörben talál.

Az interfészek tartalmazhatnak példánymetasztereket, tulajdonságokat, eseményeket, indexelőket vagy a négy tagtípus bármilyen kombinációját. Az interfészek statikus konstruktorokat, mezőket, állandókat vagy operátorokat tartalmazhatnak. A C# 11-től kezdődően előfordulhat static abstract, hogy a nem mezőket tartalmazó felülettagok. Az interfészek nem tartalmazhatnak példánymezőket, példánykonstruktorokat vagy véglegesítőket. A felület tagjai alapértelmezés szerint nyilvánosak, és explicit módon megadhatja az akadálymentességi módosítókat, például public, protected, internal, private, protected internalvagy private protected. A private tagoknak alapértelmezett implementációval kell rendelkezniük.

Az illesztőtagok implementálásához a implementálási osztály megfelelő tagjának nyilvánosnak, nem statikusnak kell lennie, és ugyanazzal a névvel és aláírással kell rendelkeznie, mint az interfész tagjának.

Feljegyzés

Ha egy interfész statikus tagokat deklarál, az azt megvalósító típus a statikus tagokat is deklarálhatja ugyanazzal az aláírással. Ezeket a tagot deklaráló típus megkülönbözteti és egyedileg azonosítja. A típusban deklarált statikus tag nem bírálja felül a felületen deklarált statikus tagot.

Az interfészt megvalósító osztálynak vagy szerkezetnek minden deklarált tag számára biztosítania kell egy implementációt anélkül, hogy az interfész által biztosított alapértelmezett implementációt biztosítanák. Ha azonban egy alaposztály implementál egy interfészt, az alaposztályból származtatott bármely osztály örökli ezt a megvalósítást.

Az alábbi példa a felület implementálását IEquatable<T> mutatja be. A végrehajtási osztálynak Carbiztosítania kell a módszer implementálását Equals .

public class Car : IEquatable<Car>
{
    public string? Make { get; set; }
    public string? Model { get; set; }
    public string? Year { get; set; }

    // Implementation of IEquatable<T> interface
    public bool Equals(Car? car)
    {
        return (this.Make, this.Model, this.Year) ==
            (car?.Make, car?.Model, car?.Year);
    }
}

Az osztály tulajdonságai és indexelői további kiegészítőket határozhatnak meg egy felületen definiált tulajdonsághoz vagy indexelőhöz. Egy felület például deklarálhat egy get kiegészítővel rendelkező tulajdonságot. Az interfészt megvalósító osztály ugyanazt a tulajdonságot deklarálhatja egy és egy get tartozék beállításával is. Ha azonban a tulajdonság vagy az indexelő explicit megvalósítást használ, a tartozéknak meg kell egyeznie. Az explicit implementációval kapcsolatos további információkért lásd az explicit felület implementálását és a felület tulajdonságait.

A felületek egy vagy több adaptertől örökölhetnek. A származtatott felület örökli a tagokat az alapfelületektől. A származtatott interfészt megvalósító osztálynak a származtatott felületen minden tagot implementálnia kell, beleértve a származtatott felület alapfelületeinek összes tagját is. Ez az osztály implicit módon konvertálható a származtatott felületre vagy annak bármely alapillesztőfelületére. Az osztályok tartalmazhatnak olyan interfészeket, amelyeket az általa öröklő alaposztályokon vagy más felületek által öröklő felületeken keresztül többször is használnak. Az osztály azonban csak egyszer és csak akkor biztosíthatja az illesztő implementálását, ha az osztály az osztály (class ClassName : InterfaceName) definíciójának részeként deklarálja a felületet. Ha a felület öröklődik, mert örökölt egy alaposztályt, amely implementálja az interfészt, az alaposztály biztosítja a felület tagjainak implementálását. A származtatott osztály azonban az örökölt implementáció helyett bármely virtuális felületi tagot átvehet. Amikor az interfészek egy metódus alapértelmezett implementációját deklarálják, az adott felületet implementáló osztály örökli ezt a megvalósítást (Az osztálypéldányt a felület típusára kell leadnia, hogy hozzáférjen az alapértelmezett implementációhoz a felülettagon).

Az alaposztályok virtuális tagok használatával is implementálhatnak felülettagokat. Ebben az esetben a származtatott osztály a virtuális tagok felülbírálásával módosíthatja az interfész viselkedését. A virtuális tagokkal kapcsolatos további információkért lásd a polimorfizmust.

Interfészek összegzése

Az illesztő a következő tulajdonságokkal rendelkezik:

  • A 8.0-nál korábbi C#-verziókban a felület olyan, mint egy absztrakt alaposztály, amely csak absztrakt tagokkal rendelkezik. Az interfészt megvalósító osztálynak vagy szerkezetnek minden tagját implementálnia kell.
  • A C# 8.0-tól kezdődően az interfészek meghatározhatják az alapértelmezett implementációkat néhány vagy az összes tag számára. Az interfészt megvalósító osztálynak vagy szerkezetnek nem kell alapértelmezett implementációkkal rendelkező tagokat implementálnia. További információkért tekintse meg az alapértelmezett felületi metódusokat.
  • A felület nem hozható létre közvetlenül. Tagjait bármely olyan osztály vagy struktúra implementálja, amely megvalósítja az interfészt.
  • Egy osztály vagy szerkezet több interfészt is képes implementálni. Az osztály örökölhet egy alaposztályt, és egy vagy több interfészt is implementálhat.