Co je rozhraní v C# s příkladem

⚡ Chytré shrnutí

Rozhraní v C# definuje contract, který specifikuje, které metody a vlastnosti musí třída implementovat, aniž by poskytoval skutečný kód. Implementující třída poskytuje konkrétní chování, což umožňuje volné propojení a vícenásobnou dědičnost napříč nesouvisejícími typy.

  • 🔗 stract: Rozhraní deklaruje signatury metod a vlastností, které musí definovat každá implementující třída.
  • (Tj. Žádná implementace: Rozhraní obsahuje pouze deklarace, takže třída zapisuje skutečný kód metody.
  • 🔑 Klíčové slovo: Klíčové slovo interface vytváří typ a třída ho implementuje pomocí dvojtečky.
  • 🔀 Více rozhraní: Jedna třída může implementovat mnoho rozhraní, což dává C# formu vícenásobné dědičnosti.
  • ⚖ Rozhraní vs. abstractřída t: Rozhraní definují pouze chování, zatímco abstracTřídy t mohou také obsahovat sdílený stav a kód.
  • 🤖 Asistence AI: GitHub Copilot scaffolduje rozhraní a implementace a kanály ML.NET se spoléhají na transformátor založený na rozhraních.tracts.

Rozhraní v C#

Co je rozhraní v C#?

An Rozhraní V C# se používá spolu s třídou k definování contract, což je dohoda o tom, co bude třída poskytovat aplikaci. Rozhraní definuje, jaké operace může třída provádět. Rozhraní deklaruje vlastnosti a metody. Je na třídě, aby přesně definovala, co bude metoda dělat.

Podívejme se na příklad rozhraní změnou tříd v naší konzolové aplikaci. Všimněte si, že nebudeme spouštět kód, protože neexistuje nic, co by bylo možné spustit pomocí rozhraní.

Příklad rozhraní C#

Vytvořme třídu rozhraní. Třída se bude jmenovat „Guru„99Interface.“ Naše hlavní třída poté rozšíří definované rozhraní. Veškerý kód je třeba napsat do souboru Program.cs.

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 Vysvětlení:-

Zde vysvětlíme důležité části kódu

Příklad rozhraní C#

  1. Nejprve definujeme rozhraní s názvem „Guru99Rozhraní.“ Všimněte si, že klíčové slovo „rozhraní“ se používá k definování rozhraní.
  2. Dále definujeme metody, které bude naše rozhraní používat. V tomto případě definujeme stejné metody, jaké byly použity ve všech předchozích příkladech. Všimněte si, že rozhraní pouze deklaruje metody. Nedefinuje v nich kód.
  3. Pak si uděláme naše GuruTřída 99Tutorial rozšiřuje rozhraní. Zde píšeme kód, který definuje různé metody deklarované v rozhraní. Tento typ kódování dosahuje následujících výsledků.
    • Zajišťuje, že třída, Guru99Tutorial přidává pouze kód, který je nezbytný pro metody „SetTutorial“ a „GetTutorial“ a nic dalšího.
    • Také zajišťuje, že se rozhraní chová jako podvodník.tract. The třída musí dodržovat podmínkytract. Takže pokud podvodtracPokud t říká, že by měl mít dvě metody s názvem „SetTutorial“ a „GetTutorial“, pak by to tak mělo být.

Rozhraní C# vs. AbstracTřída t

Častou otázkou pro začátečníky je, jak se rozhraní C# liší od abstractřída TOba definují podvod.trackteré ostatní typy následují, přesto slouží jiným designovým cílům.

Klíčové rozdíly jsou uvedeny níže:

  • Realizace: Rozhraní obsahuje pouze deklarace, zatímco abstracTřída t může poskytnout jak břišní svalytract členů a plně implementovaných metod.
  • Vícenásobná dědičnost: Třída může implementovat mnoho rozhraní, ale může dědit pouze jeden abs.tractřída t.
  • Stát: Břišní svalytracTřída t může obsahovat pole, konstruktory a vlastnosti s daty, zatímco rozhraní nemůže ukládat stav instance.
  • Modifikátory přístupu: AbstracČlenové třídy t mohou být veřejní, chránění nebo privátní, zatímco členové klasického rozhraní jsou implicitně veřejní.
  • Použití: Použijte rozhraní k přidání funkce napříč nesouvisejícími typy a abstractřída t pro sdílení společného kódu mezi blízce souvisejícími typy.

Stručně řečeno, rozhraní popisuje, co třída dokáže, zatímco abstracTřída t může také definovat část toho, jak se to dělá.

Jak implementovat více rozhraní v C#

Na rozdíl od dědění tříd umožňuje jazyk C# implementovat více než jedno rozhraní v rámci jedné třídy. Tímto způsobem jazyk nabízí bezpečnou formu vícenásobné dědičnosti bez nejednoznačnosti, která vzniká při dědění několika základních tříd najednou.

Chcete-li implementovat více rozhraní, uveďte je za názvem třídy a oddělte každé z nich čárkou. Třída pak musí definovat každou metodu deklarovanou v každém rozhraní, které implementuje.

Krok 1) Deklarujte dvě rozhraní, každé s vlastní metodou.

Krok 2) Vytvořte třídu, která implementuje obě rozhraní, a oddělte názvy rozhraní čárkou.

Krok 3) Pro každého člena deklarovaného v každém rozhraní zadejte tělo metody.

Níže uvedený příklad ukazuje třídu Document, která implementuje jak IReadable a rozhraní IWritable.

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 Vysvětlení:-

  1. Deklarujeme dvě rozhraní, I.Readable a IWritable. Každé rozhraní deklaruje jednu metodu bez těla.
  2. Třída Document uvádí obě rozhraní za dvojtečkou, oddělená čárkou, takže souhlasí s respektováním obou con.tracts.
  3. Třída poté definuje metody Read a Write. Přeskočit.ping obě metody by způsobily chybu při kompilaci.
  4. Metoda Main vytvoří objekt Document a volá obě metody, čímž dokáží, že třída splňuje obě rozhraní.

Když program běží, vypíše Čtení dokumentu na prvním řádku a Zápis do dokumentu na druhém řádku. Tento vzor udržuje každý contracJe malá a zaměřená na konkrétní třídu, což usnadňuje testování a rozšiřování třídy Document.

Výhody použití rozhraní v C#

Rozhraní se široce používají v profesionálních projektech v C#, protože usnadňují údržbu kódu a zvyšují jeho flexibilitu. Umožňují programovat s ohledem na...tract spíše než ke konkrétní třídě.

Mezi hlavní výhody patří:

  • Volné spojení: Code závisí na rozhraní, nikoli na konkrétní třídě, takže implementace se může změnit bez narušení volajících metod.
  • Vícenásobná dědičnost: Třída může dědit chování z několika rozhraní, což prostá dědičnost tříd neumožňuje.
  • Testovatelnost: Rozhraní usnadňují výměnu skutečné třídy za falešný objekt během jednotkového testování.
  • Vkládání závislostí: Frameworky vkládají implementaci rozhraní za běhu, což je základní myšlenka, na které stojí principy SOLID.
  • Konzistence: Každá implementující třída je nucena poskytovat stejnou sadu členů, což udržuje API předvídatelné.

Díky těmto výhodám jsou rozhraní srdcem většiny moderních návrhových vzorů a aplikačních frameworků v C#.

Nejčastější dotazy

Podle konvence začíná název rozhraní v C# velkým písmenem I, například IDisposable nebo I.ReadablePředpona I okamžitě signalizuje, že typ je rozhraní, nikoli třída nebo struktura.

Před verzí C# 8.0 obsahovalo rozhraní pouze deklarace. Od verze C# 8.0 dále umožňují výchozí metody rozhraní rozhraní poskytnout tělo metody, takže starší implementace fungují i ​​při přidání nových členů.

Explicitní implementace pojmenovává člena jeho prefixem rozhraní, například I.Readable.Read. Člen je pak volatelný pouze prostřednictvím odkazu na rozhraní, což zabraňuje kolizím názvů, když dvě rozhraní deklarují stejnou metodu.

Ano. Rozhraní může dědit jedno nebo více dalších rozhraní. Třída, která implementuje podřízené rozhraní, pak musí definovat každou metodu jak z podřízeného, ​​tak ze všech zděděných nadřazených rozhraní.

Ne. Rozhraní nelze vytvořit přímo, protože nemá žádnou implementaci. Vytvoříte objekt třídy, která implementuje rozhraní, a poté se na tento objekt odkážete prostřednictvím typu rozhraní.

Ano. Členové klasického rozhraní jsou implicitně veřejní a nelze k nim přidávat modifikátory přístupu. Implementační třída musí také deklarovat odpovídající členy jako veřejné.

Ano. GitHub Copilot dokáže vytvořit scaffold rozhraní, navrhnout jeho signatury metod a vygenerovat třídu, která ho implementuje, z krátkého komentáře nebo názvu rozhraní, což urychluje con.tract-první vývoj.

ML.NET se k definování svého kanálu strojového učení spoléhá na rozhraní jako ITransformer a IDataView. Kódování pro tato rozhraní může...tracts umožňuje výměnu modelů a zdrojů dat bez nutnosti přepisování okolního trénovacího kódu.

Shrňte tento příspěvek takto: