Mi az interfész a C#-ban példával

⚡ Okos összefoglaló

A C# interfésze definiál egy con-ttract, amely meghatározza, hogy egy osztálynak mely metódusokat és tulajdonságokat kell megvalósítania, anélkül, hogy magát a kódot megadná. A megvalósító osztály biztosítja a konkrét viselkedést, lehetővé téve a laza csatolást és a többszörös öröklődést a független típusok között.

  • 🔗 Contract: Egy interfész deklarálja a metódusokat és tulajdonság-szignatúrákat, amelyeket minden implementáló osztálynak definiálnia kell.
  • Nincs megvalósítás: Egy interfész csak deklarációkat tárol, így az osztály írja a tényleges metóduskódot.
  • 🔑 Kulcsszó: Az interface kulcsszó hozza létre a típust, és egy osztály kettősponttal valósítja meg azt.
  • 🔀 Több interfész: Egy osztály sok interfészt képes megvalósítani, így a C# a többszörös öröklődés egy formáját kapja.
  • Interfész vs. hastract osztály: Az interfészek csak a viselkedést definiálják, míg az abstracA t osztályok megosztott állapotot és kódot is tartalmazhatnak.
  • 🤖 AI segítség: A GitHub Copilot állványozza az interfészeket és implementációkat, az ML.NET folyamatai pedig interfész-alapú transzformátorvezérlőkre támaszkodnak.tracts.

C# interfész

Mi az interfész a C#-ban?

An Felület C#-ban egy osztállyal együtt használjuk con definiálásáratract ami egy megállapodás arról, hogy mit biztosít az osztály egy alkalmazásnak. Az interfész határozza meg, hogy milyen műveleteket hajthat végre egy osztály. Az interfész deklarálja a tulajdonságokat és a metódusokat. Az osztály feladata, hogy pontosan meghatározza, mit fog tenni a metódus.

Nézzünk egy példát egy interfészre a konzolalkalmazásunk osztályainak megváltoztatásával. Ne feledje, hogy nem fogjuk futtatni a kódot, mert semmi sem futtatható interfész segítségével.

C# interfész példa

Hozzunk létre egy interfész osztályt. Az osztály neve „Guru99Interface.” A fő osztályunk ezután kibővíti a definiált interfészt. Az összes kódot a Program.cs fájlba kell írni.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 interface IGuru99Interface
 {
  void SetTutorial(int pID, string pName);
  String GetTutorial();
 }

 class Guru99Tutorial : IGuru99Interface
 {
  protected int TutorialID;
  protected string TutorialName;

  public void SetTutorial(int pID, string pName)
  {
   TutorialID = pID;
   TutorialName = pName;
  }

  public String GetTutorial()
  {
   return TutorialName;
  }

  static void Main(string[] args)
  {
   Guru99Tutorial pTutor = new Guru99Tutorial();

   pTutor.SetTutorial(1,".Net by Guru99");

   Console.WriteLine(pTutor.GetTutorial());

   Console.ReadKey();
  }
 }
}

Code Magyarázat:-

Itt elmagyarázzuk a kód fontos részeit

C# interfész példa

  1. Először definiálunk egy interfészt, amit úgy hívunk: „Guru99Interface.” Megjegyzendő, hogy az „interfész” kulcsszó egy interfész definiálására szolgál.
  2. Ezután meghatározzuk a felületünk által használt metódusokat. Ebben az esetben ugyanazokat a módszereket határozzuk meg, amelyeket az összes korábbi példában használtunk. Vegye figyelembe, hogy egy interfész csak deklarálja a metódusokat. Nem határozza meg a kódot bennük.
  3. Ezután elkészítjük a miénket GuruA 99Tutorial osztály kiterjeszti az interfészt. Ide írjuk a kódot, amely definiálja az interfészben deklarált különféle metódusokat. Ez a fajta kódolás a következőket éri el:
    • Biztosítja, hogy az osztály, GuruA 99Tutorial csak a „SetTutorial” és „GetTutorial” metódusokhoz szükséges kódot adja hozzá, semmi mást.
    • Azt is biztosítja, hogy a felület úgy viselkedjen, mint egy contract. A osztály be kell tartania a szabályttract. Tehát, ha a kontratracHa a `t` azt mondja, hogy két metódusnak kell lennie, a „SetTutorial”-nak és a „GetTutorial”-nak, akkor ennek így kell lennie.

C# interfész vs. Abstract osztály

A kezdők gyakran kérdezik, hogy miben különbözik egy C# interfész egy C#-tól. abstract osztályMindkettő definiál egy hátrányttract hogy más típusok is követik, mégis más tervezési célokat szolgálnak.

A főbb különbségek az alábbiakban felsorolva vannak:

  • Végrehajtás: Egy interfész csak deklarációkat tartalmaz, míg egy abstracA t óra mindkét hasizomra jótékony hatással bír.tract tagok és teljes mértékben megvalósított módszerek.
  • Többszörös öröklődés: Egy osztály sok interfészt implementálhat, de csak egyet örökölhettract osztály.
  • Állami: Egy hasizmottracA t osztály mezőket, konstruktorokat és tulajdonságokat tárolhat adatokkal, míg egy interfész nem képes példányállapotot tárolni.
  • Hozzáférési módosítók: AbstracA t osztály tagjai lehetnek nyilvánosak, védettek vagy privátak, míg a klasszikus interfésztagok implicit módon nyilvánosak.
  • Használat esetén: Használjon egy interfészt egy képesség hozzáadásához a nem kapcsolódó típusok között, és egy abstract osztály a közös kód megosztására a szorosan rokon típusok között.

Röviden, egy interfész leírja, hogy mit tud tenni egy osztály, míg egy abs.tracA t osztály a megvalósítás egy részét is meghatározhatja.

Hogyan valósítsunk meg több interfészt C#-ban

Az osztályörökléstől eltérően a C# lehetővé teszi egyetlen osztály számára, hogy egynél több interfészt valósítson meg. Így kínálja a nyelv a többszörös öröklés biztonságos formáját, anélkül a kétértelműség, ami több alaposztály egyidejű örökléséből adódik.

Több interfész implementálásához sorold fel őket az osztály neve után, és vesszővel válaszd el őket. Az osztálynak ezután definiálnia kell az összes olyan metódust, amelyet az általa megvalósított interfészekben deklarálnak.

Step 1) Deklarálj két interfészt, mindegyiket saját metódussal.

Step 2) Hozz létre egy osztályt, amely mindkét interfészt megvalósítja, vesszővel elválasztva az interfészek nevét.

Step 3) Adjon meg egy metódus törzset minden egyes interfészben deklarált taghoz.

Az alábbi példa egy olyan Document osztályt mutat be, amely egy I osztályt is megvalósít.Readable és egy IWritable felület.

using System;
namespace DemoApplication
{
 interface IReadable
 {
  void Read();
 }
 interface IWritable
 {
  void Write();
 }
 class Document : IReadable, IWritable
 {
  public void Read()
  {
   Console.WriteLine("Reading the document");
  }
  public void Write()
  {
   Console.WriteLine("Writing to the document");
  }
  static void Main(string[] args)
  {
   Document doc = new Document();
   doc.Read();
   doc.Write();
   Console.ReadKey();
  }
 }
}

Code Magyarázat:-

  1. Két interfészt deklarálunk, I.Readable és IWritable. Minden interfész egyetlen metódust deklarál törzs nélkül.
  2. A Document osztály mindkét interfészt kettőspont után, vesszővel elválasztva sorolja fel, így beleegyezik, hogy mindkét interfészt figyelembe veszi.tracts.
  3. Az osztály ezután definiálja a Read és Write metódusokat.ping bármelyik módszer fordítási idejű hibát okozna.
  4. A Main metódus létrehoz egy Document objektumot, és meghívja mindkét metódust, ezzel bizonyítva, hogy az osztály kielégíti a két interfész feltételét.

Amikor a program fut, kinyomtatja A dokumentum olvasása az első sorban és Írás a dokumentumba a második sorban. Ez a minta minden egyestracKicsi és fókuszált, ami megkönnyíti a Document osztály tesztelését és bővítését.

A C# interfészek használatának előnyei

A interfészeket széles körben használják a professzionális C# projektekben, mivel rugalmassá és könnyebben karbantarthatóvá teszik a kódot. Lehetővé teszik a bonyolultabb programozást.tract, nem pedig egy konkrét osztályba.

A főbb előnyök közé tartozik:

  • Laza tengelykapcsoló: Code az interfésztől függ, nem egy adott osztálytól, így egy implementáció a hívók működésének megszakítása nélkül változhat.
  • Többszörös öröklődés: Egy osztály több interfész viselkedését is örökölheti, amit a sima osztályöröklődés nem tesz lehetővé.
  • Tesztelhetőség: Az interfészek egyszerűvé teszik egy valós osztály álobjektumra cserélését az egységtesztelés során.
  • Függőség injekció: A keretrendszerek futásidőben injektálnak egy interfész implementációt, ami a SOLID alapelvek egyik alapgondolata.
  • Következetesség: Minden implementáló osztály kénytelen ugyanazokat a tagokat biztosítani, ami az API kiszámíthatóvá tételét biztosítja.

Ezen előnyök miatt az interfészek a legtöbb modern C# tervezési minta és alkalmazáskeretrendszer középpontjában állnak.

GYIK

Megállapodás szerint a C# interfész neve nagybetűvel, I-vel kezdődik, például IDisposable vagy IReadableAz I előtag azonnal jelzi, hogy a típus egy interfész, nem pedig egy osztály vagy struktúra.

A C# 8.0 előtt egy interfész csak deklarációkat tartalmazott. A C# 8.0-tól kezdődően az alapértelmezett interfészmetódusok lehetővé tették az interfész számára, hogy metódustörzset biztosítsanak, így a régebbi implementációk továbbra is működnek új tagok hozzáadásakor.

Az explicit implementáció a tagokat az interfész előtagjukkal nevezi meg, például IReadable.Olvasás. A tag ezután csak egy interfészhivatkozáson keresztül hívható meg, ami elkerüli a névütközéseket, amikor két interfész ugyanazt a metódust deklarálja.

Igen. Egy interfész örökölhet egy vagy több másik interfészt. Egy osztálynak, amely megvalósítja a gyermek interfészt, ezután definiálnia kell mind a gyermek, mind az összes örökölt szülő interfész minden metódusát.

Nem. Egy interfészt nem lehet közvetlenül példányosítani, mivel nincs implementációja. Létrehozol egy objektumot egy osztályból, amely implementálja az interfészt, majd hivatkozol erre az objektumra az interfész típusán keresztül.

Igen. Egy klasszikus interfész tagjai implicit módon nyilvánosak, és nem adhatsz hozzájuk hozzáférés-módosítókat. A megvalósító osztálynak a megfelelő tagokat is nyilvánosként kell deklarálnia.

Igen. A GitHub Copilot képes egy interfészt scaffolálni, javaslatokat tenni a metódusaláírásaira, és egy rövid megjegyzésből vagy az interfész nevéből létrehozni egy olyan osztályt, amely megvalósítja azt, ami felgyorsítja a konverziót.tract-első fejlesztés.

Az ML.NET olyan interfészekre támaszkodik, mint az ITransformer és az IDataView, a gépi tanulási folyamat definiálásához. A kódolás ezen interfészek ellen...tracA ts lehetővé teszi a modellek és adatforrások cseréjét a környező betanító kód átírása nélkül.

Foglald össze ezt a bejegyzést a következőképpen: