Hva er grensesnitt i C# med eksempel

โšก Smart oppsummering

Grensesnitt i C# definerer en contract som spesifiserer hvilke metoder og egenskaper en klasse mรฅ implementere, uten รฅ oppgi selve koden. Implementeringsklassen leverer den konkrete oppfรธrselen, noe som muliggjรธr lรธs kobling og multippel arv pรฅ tvers av urelaterte typer.

  • ๐Ÿ”— medtract: Et grensesnitt deklarerer metode- og egenskapssignaturene som hver implementeringsklasse mรฅ definere.
  • โœ… Ingen implementering: Et grensesnitt inneholder bare deklarasjoner, sรฅ klassen skriver den faktiske metodekoden.
  • ๐Ÿ”‘ sรธkeord: Nรธkkelordet grensesnitt oppretter typen, og en klasse bruker et kolon for รฅ implementere den.
  • ๐Ÿ”€ Flere grensesnitt: ร‰n klasse kan implementere mange grensesnitt, noe som gir C# en form for multippel arv.
  • โš– Grensesnitt vs. abstract-klasse: Grensesnitt definerer bare atferd, mens abstract-klasser kan ogsรฅ inneholde delt tilstand og kode.
  • ๐Ÿค– AI-hjelp: GitHub Copilot stillaserer grensesnitt og implementeringer, og ML.NET-pipeliner er avhengige av grensesnittbaserte transformatorkonfigurasjoner.tracts.

Grensesnitt i C#

Hva er grensesnitt i C#?

An Interface i C# brukes sammen med en klasse for รฅ definere en kontract som er en avtale om hva klassen skal gi til et program. Grensesnittet definerer hvilke operasjoner en klasse kan utfรธre. Et grensesnitt deklarerer egenskapene og metodene. Det er opp til klassen รฅ definere nรธyaktig hva metoden skal gjรธre.

La oss se pรฅ et eksempel pรฅ et grensesnitt ved รฅ endre klassene i vรฅr konsollapplikasjon. Merk at vi ikke kjรธrer koden fordi det ikke er noe som kan kjรธres ved hjelp av et grensesnitt.

Eksempel pรฅ C#-grensesnitt

La oss lage en grensesnittklasse. Klassen vil bli kalt ยซGuru99Interface.ยป Hovedklassen vรฅr vil deretter utvide det definerte grensesnittet. All koden mรฅ skrives i Program.cs-filen.

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 Forklaring:-

Her forklarer vi de viktige delene av koden

Eksempel pรฅ C#-grensesnitt

  1. Vi definerer fรธrst et grensesnitt kalt ยซGuru99Interface.ยป Merk at nรธkkelordet ยซgrensesnittยป brukes til รฅ definere et grensesnitt.
  2. Deretter definerer vi metodene som skal brukes av grensesnittet vรฅrt. I dette tilfellet definerer vi de samme metodene som er brukt i alle tidligere eksempler. Merk at et grensesnitt bare erklรฆrer metodene. Den definerer ikke koden i dem.
  3. Sรฅ lager vi vรฅre Guru99Tutorial-klassen utvider grensesnittet. Her skriver vi koden som definerer de ulike metodene som er deklarert i grensesnittet. Denne typen koding oppnรฅr fรธlgende
    • Det sikrer at klassen, Guru99Tutorial legger bare til koden som er nรธdvendig for metodene ยซSetTutorialยป og ยซGetTutorialยป og ingenting annet.
    • Det sikrer ogsรฅ at grensesnittet oppfรธrer seg som en svindel.tract. Den klasse mรฅ overholde konvensjonentract. Sรฅ hvis ulempentracHvis det stรฅr at den skal ha to metoder kalt ยซSetTutorialยป og ยซGetTutorialยป, sรฅ er det slik det skal vรฆre.

C#-grensesnitt vs. Abstract-klasse

Et vanlig spรธrsmรฅl for nybegynnere er hvordan et C#-grensesnitt skiller seg fra et abstracT-klasseBegge definerer en ulempetracat andre typer fรธlger, men de tjener andre designmรฅl.

De viktigste forskjellene er listet opp nedenfor:

  • Gjennomfรธring: Et grensesnitt inneholder bare deklarasjoner, mens et abstract-klassen kan gi bรฅde magemusklertract-medlemmer og fullt implementerte metoder.
  • Multippel arv: En klasse kan implementere mange grensesnitt, men kan bare arve รฉn ABStract-klassen.
  • Tilstand: En magemuskeltract-klassen kan inneholde felt, konstruktรธrer og egenskaper med data, mens et grensesnitt ikke kan lagre instanstilstand.
  • Tilgangsmodifikatorer: AbstracMedlemmer i t-klassen kan vรฆre offentlige, beskyttede eller private, mens medlemmer i klassiske grensesnitt implisitt er offentlige.
  • Bruk tilfelle: Bruk et grensesnitt for รฅ legge til en funksjon pรฅ tvers av urelaterte typer, og en abstract-klassen for รฅ dele felles kode mellom nรฆrt beslektede typer.

Kort sagt beskriver et grensesnitt hva en klasse kan gjรธre, mens en abstract-klassen kan ogsรฅ definere deler av hvordan det gjรธres.

Slik implementerer du flere grensesnitt i C#

I motsetning til klassearv, tillater C# en enkelt klasse รฅ implementere mer enn ett grensesnitt. Slik tilbyr sprรฅket en sikker form for multippel arv uten tvetydigheten som oppstรฅr ved รฅ arve flere basisklasser samtidig.

For รฅ implementere flere grensesnitt, oppgi dem etter klassenavnet og atskil hvert grensesnitt med komma. Klassen mรฅ deretter definere hver metode som er deklarert i hvert grensesnitt den implementerer.

Trinn 1) Deklarer to grensesnitt, hvert med sin egen metode.

Trinn 2) Lag en klasse som implementerer begge grensesnittene, og separer grensesnittnavnene med komma.

Trinn 3) Oppgi en metodekropp for hvert medlem som er deklarert i hvert grensesnitt.

Eksemplet nedenfor viser en Document-klasse som implementerer bรฅde en IReadable og et IWritable-grensesnitt.

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 Forklaring:-

  1. Vi deklarerer to grensesnitt, jegReadable og IWritable. Hvert grensesnitt deklarerer รฉn metode uten brรธdtekst.
  2. Dokument-klassen viser begge grensesnittene etter kolon, atskilt med komma, slik at den godtar begge konfigurasjonene.tracts.
  3. Klassen definerer deretter metodene Read og Write. Hopp overping Begge metodene ville forรฅrsake en kompileringsfeil.
  4. Main-metoden oppretter et Document-objekt og kaller begge metodene, noe som beviser at klassen tilfredsstiller de to grensesnittene.

Nรฅr programmet kjรธrer, skriver det ut Leser dokumentet pรฅ den fรธrste linjen og Skriver til dokumentet pรฅ den andre linjen. Dette mรธnsteret holder hver kontract liten og fokusert, noe som gjรธr det enklere รฅ teste og utvide Dokument-klassen.

Fordeler med รฅ bruke grensesnitt i C#

Grensesnitt brukes mye i profesjonelle C#-prosjekter fordi de gjรธr kode fleksibel og enklere รฅ vedlikeholde. De lar deg programmere til en standardiserttract snarere enn til en konkret klasse.

De viktigste fordelene inkluderer:

  • Lรธs kobling: Code avhenger av grensesnittet, ikke en spesifikk klasse, sรฅ en implementering kan endres uten รฅ รธdelegge kallerne.
  • Multippel arv: En klasse kan arve atferd fra flere grensesnitt, noe vanlig klassearv ikke tillater.
  • Testbarhet: Grensesnitt gjรธr det enkelt รฅ bytte ut en ekte klasse med et mock-objekt under enhetstesting.
  • Avhengighetsinjeksjon: Rammeverk injiserer en grensesnittimplementering under kjรธretid, en kjerneidรฉ bak SOLID-prinsippene.
  • Konsistens: Hver implementeringsklasse er tvunget til รฅ tilby det samme settet med medlemmer, noe som holder et API forutsigbart.

Pรฅ grunn av disse fordelene ligger grensesnitt i hjertet av de fleste moderne C#-designmรธnstre og applikasjonsrammeverk.

Spรธrsmรฅl og svar

I fรธlge konvensjonen starter et C#-grensesnittnavn med stor bokstav I, for eksempel IDisposable eller IReadableI-prefikset signaliserer umiddelbart at typen er et grensesnitt snarere enn en klasse eller struktur.

Fรธr C# 8.0 inneholdt et grensesnitt bare deklarasjoner. Fra C# 8.0 og utover lar standard grensesnittmetoder et grensesnitt gi en metodekropp, slik at eldre implementeringer fortsetter รฅ fungere nรฅr nye medlemmer legges til.

Eksplisitt implementering navngir et medlem med grensesnittprefikset, for eksempel IReadable.Read. Medlemmet kan da bare kalles gjennom en grensesnittreferanse, noe som unngรฅr navnekollisjoner nรฅr to grensesnitt deklarerer den samme metoden.

Ja. Et grensesnitt kan arve ett eller flere andre grensesnitt. En klasse som implementerer barnegrensesnittet mรฅ deretter definere alle metoder fra bรฅde barnegrensesnittet og alle arvede foreldregrensesnitt.

Nei. Et grensesnitt kan ikke instansieres direkte fordi det ikke har noen implementering. Du oppretter et objekt i en klasse som implementerer grensesnittet, og refererer deretter til det objektet gjennom grensesnitttypen.

Ja. Medlemmer av et klassisk grensesnitt er implisitt offentlige, og du kan ikke legge til tilgangsmodifikatorer i dem. Implementeringsklassen mรฅ ogsรฅ deklarere de samsvarende medlemmene som offentlige.

Ja. GitHub Copilot kan bygge et grensesnitt, foreslรฅ metodesignaturer og generere en klasse som implementerer det fra en kort kommentar eller grensesnittnavnet, noe som fremskynder tilkoblingen.tract-fรธrste utvikling.

ML.NET er avhengig av grensesnitt som ITransformer og IDataView for รฅ definere maskinlรฆringsprosessen. Koding mot disse grensesnittene kantracts lar deg bytte modeller og datakilder uten รฅ mรฅtte omskrive den omkringliggende treningskoden.

Oppsummer dette innlegget med: