Що таке інтерфейс у C# з прикладом

⚡ Розумний підсумок

Інтерфейс у C# визначає конtract, який визначає, які методи та властивості має реалізувати клас, не надаючи фактичного коду. Клас, що реалізує, надає конкретну поведінку, що дозволяє слабке зв'язування та множинне успадкування між непов'язаними типами.

  • 🔗 зtract: Інтерфейс оголошує сигнатури методів та властивостей, які має визначити кожен клас, що реалізує.
  • Без реалізації: Інтерфейс містить лише оголошення, тому клас пише фактичний код методу.
  • 🔑 Ключове слово: Ключове слово interface створює тип, а клас використовує двокрапку для його реалізації.
  • 🔀 Кілька інтерфейсів: Один клас може реалізувати багато інтерфейсів, що надає C# форми множинного успадкування.
  • Інтерфейс проти ABStracт-клас: Інтерфейси визначають лише поведінку, тоді як abstracКласи t також можуть містити спільний стан та код.
  • 🤖 Допомога AI: GitHub Copilot створює інтерфейси та реалізації, а конвеєри ML.NET покладаються на трансформаторні системи на основі інтерфейсів.tracц.

Інтерфейс у C#

Що таке інтерфейс у C#?

An інтерфейс У C# використовується разом із класом для визначення contract, що є угодою про те, що клас надаватиме застосунку. Інтерфейс визначає, які операції може виконувати клас. Інтерфейс оголошує властивості та методи. Клас повинен точно визначити, що робитиме метод.

Давайте розглянемо приклад інтерфейсу, змінивши класи в нашій консольній програмі. Зауважте, що ми не будемо запускати код, оскільки немає нічого, що можна запустити за допомогою інтерфейсу.

Приклад інтерфейсу C#

Давайте створимо клас інтерфейсу. Клас називатиметься «Guru99Interface.” Наш основний клас потім розширить визначений інтерфейс. Весь код потрібно записати у файлі 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 Пояснення:

Тут ми пояснюємо важливі розділи коду

Приклад інтерфейсу C#

  1. Спочатку ми визначаємо інтерфейс під назвою «Guru99Інтерфейс.” Зверніть увагу, що ключове слово “інтерфейс” використовується для визначення інтерфейсу.
  2. Далі ми визначаємо методи, які використовуватиме наш інтерфейс. У цьому випадку ми визначаємо ті самі методи, які використовуються в усіх попередніх прикладах. Зауважте, що інтерфейс лише оголошує методи. Він не визначає код у них.
  3. Потім ми робимо наше GuruКлас 99Tutorial розширює інтерфейс. Тут ми пишемо код, який визначає різні методи, оголошені в інтерфейсі. Такий тип кодування досягає наступного
    • Це гарантує, що клас, Guru99Tutorial додає лише код, необхідний для методів «SetTutorial» та «GetTutorial», і нічого більше.
    • Це також гарантує, що інтерфейс поводиться як шахрайtract. The клас має дотримуватися умовtracт. Отже, якщо конtracЯкщо t каже, що має бути два методи під назвою «SetTutorial» та «GetTutorial», то так і має бути.

Інтерфейс C# проти AbstracКлас т

Поширене питання для початківців: чим відрізняється інтерфейс C# від ABStracт-класОбидва визначають шахрайствоtracт, яким наслідують інші типи, проте вони служать різним цілям дизайну.

Ключові відмінності перелічені нижче:

  • Реалізація: Інтерфейс містить лише оголошення, тоді як abstract-клас може забезпечити як пресtract членів та повністю реалізованих методів.
  • Множинне успадкування: Клас може реалізувати багато інтерфейсів, але може успадкувати лише один abstracт-клас.
  • Держава: ПресtracКлас t може містити поля, конструктори та властивості з даними, тоді як інтерфейс не може зберігати стан екземпляра.
  • Модифікатори доступу: AbstracЧлени класу t можуть бути публічними, захищеними або приватними, тоді як члени класичного інтерфейсу є неявно публічними.
  • Корпус: Використовуйте інтерфейс для додавання можливостей для непов'язаних типів та абсtract-клас для спільного використання коду між тісно пов'язаними типами.

Коротше кажучи, інтерфейс описує, що може робити клас, тоді як abstracКлас t також може частково визначити, як це робиться.

Як реалізувати кілька інтерфейсів у C#

На відміну від успадкування класів, C# дозволяє одному класу реалізувати більше одного інтерфейсу. Саме так мова пропонує безпечну форму множинного успадкування без неоднозначності, яка виникає через успадкування кількох базових класів одночасно.

Щоб реалізувати кілька інтерфейсів, перелічіть їх після назви класу та розділіть кожен з них комою. Потім клас повинен визначити кожен метод, оголошений у кожному інтерфейсі, який він реалізує.

Крок 1) Оголосіть два інтерфейси, кожен зі своїм власним методом.

Крок 2) Створіть клас, який реалізує обидва інтерфейси, розділяючи імена інтерфейсів комами.

Крок 3) Надайте тіло методу для кожного члена, оголошеного в кожному інтерфейсі.

У наведеному нижче прикладі показано клас Document, який реалізує як IReadable та інтерфейс 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 Пояснення:

  1. Ми оголошуємо два інтерфейси, яReadable та IWritable. Кожен інтерфейс оголошує один метод без тіла.
  2. Клас Document перераховує обидва інтерфейси після двокрапки, розділені комою, тому він погоджується враховувати обидва con.tracц.
  3. Потім клас визначає методи Read та Write. Пропустити.ping будь-який метод спричинить помилку під час компіляції.
  4. Метод Main створює об'єкт Document та викликає обидва методи, доводячи, що клас задовольняє вимоги двох інтерфейсів.

Коли програма працює, вона друкує Читання документа на першому рядку та Запис у документ на другому рядку. Цей шаблон зберігає кожен contracневеликий та цілеспрямований, що спрощує тестування та розширення класу Document.

Переваги використання інтерфейсів у C#

Інтерфейси широко використовуються в професійних проектах C#, оскільки вони роблять код гнучким та простішим у підтримці. Вони дозволяють програмувати з певною чіткістю.tract, а не до конкретного класу.

До основних переваг можна віднести:

  • Слабке зчеплення: Code залежить від інтерфейсу, а не від конкретного класу, тому реалізація може змінюватися без порушення роботи викликаючих функцій.
  • Множинне успадкування: Клас може успадковувати поведінку від кількох інтерфейсів, що не дозволяє просте успадкування класів.
  • Тестування: Інтерфейси спрощують заміну реального класу на фіктивний об'єкт під час модульного тестування.
  • Впровадження залежностей: Фреймворки впроваджують реалізацію інтерфейсу під час виконання, що є основною ідеєю, що лежить в основі принципів SOLID.
  • Послідовність: Кожен клас реалізації змушений надавати однаковий набір членів, що забезпечує передбачуваність API.

Завдяки цим перевагам інтерфейси лежать в основі більшості сучасних шаблонів проектування та фреймворків застосунків на C#.

Поширені запитання

За домовленістю, ім'я інтерфейсу C# починається з великої літери I, наприклад, IDisposable або IReadableПрефікс I одразу сигналізує про те, що тип є інтерфейсом, а не класом чи структурою.

До C# 8.0 інтерфейс містив лише оголошення. Починаючи з C# 8.0, методи інтерфейсу за замовчуванням дозволяють інтерфейсу надавати тіло методу, тому старіші реалізації продовжують працювати навіть після додавання нових членів.

Явна реалізація іменує члена за допомогою його префікса інтерфейсу, наприклад, IReadable.Read. Член тоді можна викликати лише через посилання на інтерфейс, що дозволяє уникнути конфліктів імен, коли два інтерфейси оголошують один і той самий метод.

Так. Інтерфейс може успадковувати один або декілька інших інтерфейсів. Клас, який реалізує дочірній інтерфейс, повинен тоді визначити кожен метод як дочірнього, так і всіх успадкованих батьківських інтерфейсів.

Ні. Інтерфейс не можна створити безпосередньо, оскільки він не має реалізації. Ви створюєте об'єкт класу, який реалізує інтерфейс, а потім посилаєтесь на цей об'єкт через тип інтерфейсу.

Так. Члени класичного інтерфейсу неявно є публічними, і до них не можна додавати модифікатори доступу. Клас реалізації також повинен оголосити відповідні члени як публічні.

Так. GitHub Copilot може створювати каркас інтерфейсу, пропонувати його сигнатури методів та генерувати клас, який його реалізує, з короткого коментаря або назви інтерфейсу, що пришвидшує виконання.tract-перша розробка.

ML.NET спирається на такі інтерфейси, як ITransformer та IDataView, для визначення свого конвеєра машинного навчання. Кодування з урахуванням цих інтерфейсів може...tracts дозволяє змінювати моделі та джерела даних без переписування навколишнього навчального коду.

Підсумуйте цей пост за допомогою: