Co to jest interfejs w języku C# z przykładem

⚡ Inteligentne podsumowanie

Interfejs w C# definiuje interfejstract, który określa, które metody i właściwości klasa musi implementować, bez podawania faktycznego kodu. Klasa implementująca zapewnia konkretne zachowanie, umożliwiając luźne powiązanie i wielokrotne dziedziczenie w niezwiązanych ze sobą typach.

  • 🔗 Kontrakt: Interfejs deklaruje sygnatury metod i właściwości, które musi zdefiniować każda klasa implementująca.
  • Brak implementacji: Interfejs przechowuje wyłącznie deklaracje, więc klasa zapisuje faktyczny kod metody.
  • 🔑 słowo kluczowe: Słowo kluczowe interface tworzy typ, a klasa używa dwukropka do jego implementacji.
  • 🔀 Wiele interfejsów: Jedna klasa może implementować wiele interfejsów, co sprawia, że ​​język C# oferuje pewną formę dziedziczenia wielokrotnego.
  • Interfejs kontra abstracklasa t: Interfejsy definiują jedynie zachowanie, podczas gdy abstracKlasy t mogą również przechowywać współdzielony stan i kod.
  • 🤖 Pomoc AI: GitHub Copilot tworzy szkielet interfejsów i implementacji, a potoki ML.NET opierają się na interfejsie opartym na interfejsie transformatora.tracts.

Interfejs w C#

Co to jest interfejs w C#?

An Interfejs w C# jest używany razem z klasą do definiowania contract, czyli umowa dotycząca tego, co klasa będzie dostarczać aplikacji. Interfejs definiuje, jakie operacje może wykonywać klasa. Interfejs deklaruje właściwości i metody. To klasa musi dokładnie określić, co metoda będzie robić.

Przyjrzyjmy się przykładowi interfejsu poprzez zmianę klas w naszej aplikacji Konsola. Pamiętaj, że nie będziemy uruchamiać kodu, ponieważ nie ma niczego, co można uruchomić za pomocą interfejsu.

Przykład interfejsu C#

Utwórzmy klasę interfejsu. Klasa będzie się nazywać „Guru99Interface”. Nasza klasa główna rozszerzy wówczas zdefiniowany interfejs. Cały kod musi zostać zapisany w pliku 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 Wyjaśnienie:-

Tutaj wyjaśniamy ważne sekcje kodu

Przykład interfejsu C#

  1. Najpierw definiujemy interfejs o nazwie „Guru99Interfejs.” Należy pamiętać, że słowo kluczowe „interfejs” jest używane do zdefiniowania interfejsu.
  2. Następnie definiujemy metody, które będą używane przez nasz interfejs. W tym przypadku definiujemy te same metody, które są używane we wszystkich wcześniejszych przykładach. Należy zauważyć, że interfejs po prostu deklaruje metody. Nie definiuje w nich kodu.
  3. Następnie tworzymy nasze GuruKlasa 99Tutorial rozszerza interfejs. Tutaj piszemy kod definiujący różne metody zadeklarowane w interfejsie. Ten rodzaj kodowania osiąga następujące cele:
    • Zapewnia, że ​​klasa, Guru99Tutorial dodaje tylko kod niezbędny dla metod „SetTutorial” i „GetTutorial” i nic więcej.
    • Zapewnia również, że interfejs zachowuje się jak interfejstract. Ten klasa musi przestrzegać oszustwatract. Więc jeśli oszustwotracMówi, że powinno mieć dwie metody o nazwach „SetTutorial” i „GetTutorial”, więc tak właśnie powinno być.

Interfejs C# kontra AbstracKlasa t

Częstym pytaniem początkujących jest to, czym interfejs C# różni się od interfejsu abstracklasa T. Oba definiują oszustwotracże istnieją również inne typy, choć każdy z nich służy innym celom projektowym.

Poniżej przedstawiono najważniejsze różnice:

  • Realizacja: Interfejs zawiera tylko deklaracje, podczas gdy interfejs abstracKlasa t może zapewnić zarówno abstracczłonków i w pełni wdrożonych metod.
  • Dziedziczenie wielokrotne: Klasa może implementować wiele interfejsów, ale może dziedziczyć tylko jeden interfejs abstracklasa t.
  • Stan: Mięśnie brzuchatracKlasa t może przechowywać pola, konstruktory i właściwości z danymi, natomiast interfejs nie może przechowywać stanu instancji.
  • Modyfikatory dostępu: AbstracCzłonkowie klasy t mogą być publiczni, chronieni lub prywatni, podczas gdy członkowie klasycznego interfejsu są domyślnie publiczni.
  • Przypadek użycia: Użyj interfejsu, aby dodać możliwość w różnych typach i elementach abstracKlasa t służąca do udostępniania wspólnego kodu blisko powiązanym typom.

Krótko mówiąc, interfejs opisuje, co klasa może zrobić, podczas gdy interfejs abstracKlasa t może również definiować część sposobu wykonania.

Jak zaimplementować wiele interfejsów w C#

W przeciwieństwie do dziedziczenia klas, C# pozwala jednej klasie implementować więcej niż jeden interfejs. W ten sposób język oferuje bezpieczną formę dziedziczenia wielokrotnego, bez niejednoznaczności wynikającej z jednoczesnego dziedziczenia kilku klas bazowych.

Aby zaimplementować wiele interfejsów, wypisz je po nazwie klasy i oddziel przecinkiem. Klasa musi następnie definiować każdą metodę zadeklarowaną w każdym implementowanym interfejsie.

Krok 1) Zadeklaruj dwa interfejsy, każdy z własną metodą.

Krok 2) Utwórz klasę implementującą oba interfejsy, oddzielając nazwy interfejsów przecinkami.

Krok 3) Podaj treść metody dla każdego członka zadeklarowanego w każdym interfejsie.

Poniższy przykład przedstawia klasę Dokument implementującą zarówno interfejs IReadable i interfejs 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 Wyjaśnienie:-

  1. Deklarujemy dwa interfejsy, jaReadable i IWritable. Każdy interfejs deklaruje pojedynczą metodę bez treści.
  2. Klasa Dokument wymienia oba interfejsy po dwukropku, rozdzielone przecinkiem, więc zgadza się na przestrzeganie obutracts.
  3. Następnie klasa definiuje metody Read i Write. Pomińping obie metody spowodują błąd kompilacji.
  4. Metoda Main tworzy obiekt Document i wywołuje obie metody, udowadniając, że klasa spełnia oba interfejsy.

Po uruchomieniu programu następuje wydruk Czytanie dokumentu w pierwszej linii i Pisanie do dokumentu w drugim wierszu. Ten wzór zachowuje każdytracmałe i skoncentrowane, co sprawia, że ​​klasę Document łatwiej testować i rozszerzać.

Zalety korzystania z interfejsów w C#

Interfejsy są szeroko stosowane w profesjonalnych projektach C#, ponieważ zwiększają elastyczność kodu i ułatwiają jego utrzymanie. Pozwalają programować w sposóbtracraczej do konkretnej klasy.

Główne zalety to:

  • Luźne powiązanie: Code zależy od interfejsu, a nie od konkretnej klasy, więc implementację można zmienić bez zakłócania działania wywołujących ją obiektów.
  • Dziedziczenie wielokrotne: Klasa może dziedziczyć zachowania z kilku interfejsów, czego nie pozwala zwykłe dziedziczenie klas.
  • Testowalność: Interfejsy ułatwiają zamianę prawdziwej klasy na obiekt pozorowany podczas testów jednostkowych.
  • Wstrzykiwanie zależności: Frameworki wstrzykują implementację interfejsu w czasie wykonywania, co jest podstawową ideą zasad SOLID.
  • Konsystencja: Każda klasa implementująca musi dostarczyć ten sam zestaw elementów, co sprawia, że ​​API jest przewidywalne.

Ze względu na te korzyści interfejsy stanowią podstawę większości nowoczesnych wzorców projektowych i struktur aplikacji w języku C#.

FAQ

Zgodnie z konwencją nazwa interfejsu C# zaczyna się wielką literą I, np. IDisposable lub IReadablePrefiks I natychmiast sygnalizuje, że typ jest interfejsem, a nie klasą lub strukturą.

Przed C# 8.0 interfejs zawierał wyłącznie deklaracje. Od C# 8.0 domyślne metody interfejsu pozwalają interfejsowi na dostarczenie treści metody, więc starsze implementacje nadal działają po dodaniu nowych elementów.

Jawna implementacja nazywa członka prefiksem jego interfejsu, na przykład IReadable.Odczytaj. Członek jest wówczas wywoływalny tylko poprzez odwołanie do interfejsu, co pozwala uniknąć konfliktów nazw, gdy dwa interfejsy deklarują tę samą metodę.

Tak. Interfejs może dziedziczyć jeden lub więcej innych interfejsów. Klasa implementująca interfejs potomny musi wówczas definiować każdą metodę zarówno z interfejsu potomnego, jak i wszystkich odziedziczonych interfejsów nadrzędnych.

Nie. Interfejsu nie można utworzyć bezpośrednio, ponieważ nie ma on implementacji. Należy utworzyć obiekt klasy implementującej interfejs, a następnie odwołać się do tego obiektu poprzez typ interfejsu.

Tak. Elementy interfejsu klasycznego są domyślnie publiczne i nie można do nich dodawać modyfikatorów dostępu. Klasa implementująca musi również zadeklarować pasujące elementy jako publiczne.

Tak. GitHub Copilot może tworzyć szkielet interfejsu, sugerować jego sygnatury metod i generować klasę, która go implementuje, na podstawie krótkiego komentarza lub nazwy interfejsu, co przyspieszatracrozwój t-pierwszy.

ML.NET opiera się na interfejsach takich jak ITransformer i IDataView, aby zdefiniować swój proces uczenia maszynowego. Kodowanie dla tych interfejsów możetracts umożliwia zamianę modeli i źródeł danych bez konieczności ponownego pisania otaczającego kodu szkoleniowego.

Podsumuj ten post następująco: