Головна‎ > ‎C#‎ > ‎Класи‎ > ‎

Інтерфейс

1. Інтерфейс формує взаємодію між класами через публічні члени класу

2. Клас, що реалізують інтерфейс, повинен реалізувати члени інтерфейсу

3. Можливість встановити спільні правила взаємодії для різних класів

4. Один клас може реалізовувати багато інтерфейсів, на відміну від абстрактного класу

5. У визначенні інтерфейсу не можна розписувати методи чи вказувати модифікатори доступу

6. Не можна створювати об'єкти інтерфейсу

7. Може включати методи і властивості, але не змінні

8. Усі методи інтерфейсу є абстрактними і публічними за замовченням

9. Інтерфейс не може мати конструктора





interface IWorker  { 
     void SetWorker(string name, int year); 
     string GetWorker(); 
}


// Неправильна реалізація інтерфейсу!
class Worker : IWorker {
     void Nothing() {
          Console.WriteLine("0");
     }
}


class Worker : IWorker {
     string workerName;
     int workerYear;
     public void SetWorker(string name, int year) {
          workerName = name;
          workerYear = year;
     }
     public string GetWorker() {
          return workerYear + " " + workerYear;
     }
     public string Do()
     {
          return "Do";
     }
}


Якщо клас Worker успадковується іншим класом, то інтерфейс IWorker теж успадковується.



Інтерфейс може обмежити доступ до функцій класу, які не описані в інтерфейсі (upcast):

IWorker w1 = new Worker();    

Console.WriteLine(w1.Do());    // Не працює, функція стала приватною



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


public interface A
     int Sum(); 
}

public interface B : A
     int Minus(); 

class MyOperation : B
     int x = 10, y = 5; 
     public int Sum() { return x + y; } 
     public int Minus() { return x - y; } 
}



Якщо два інтерфейси реалізують функцію Sum() 

class MyMath : Interface1, Interface2  {
  • Або ми реалізуємо цю функцію один раз Sum()
  • Або ми вказуємо Interface1.Sum() і Interface2.Sum()



Наслідування класу та інтерфейсів:

class BMW : CarIWorker, IDriver, IRobot {


}



Покласти різні класи в один список

var cars = new List<ICar>();

car.Add(new BMW());
car.Add(new Porsche());

foreach (var car in cars) 
// (BMW(car)). - може бути, якщо цей об'єкт був бехою
}



Привести клас до інтерфейсу

(ICar)vehicle