Интерфейсы и абстрактные классы
Интерфейсы похожи на абстрактные классы: создать объект на основе интерфейса нельзя. В интерфейсах описываются методы и поля, но не реализуются. Реализация происходит в классах, реализующих интерфейс. Важное отличие: класс может реализовывать несколько интерфейсов (в отличие от единичного наследования от класса).
Создание интерфейса
Создадим интерфейс IRun в файле Run.cs в пространстве имён Project:
namespace Project
{
interface IRun
{
float Speed { get; set; }
void RobotRun();
}
}
Интерфейс описывает поля и методы без реализации. В отличие от абстрактных классов (где возможна реализация методов и конструкторов), интерфейс только описывает их. Методы интерфейса обязательно должны быть реализованы в классах, его реализующих.
Реализация интерфейса
Пусть класс Robot реализует IRun:
namespace Project
{
class Robot : IRun
{
public float Speed { get; set; }
public void RobotRun()
{
Console.WriteLine("Робот бежит");
}
}
}
Добавление : IRun заставляет компилятор потребовать реализации методов и свойств интерфейса.
Применение интерфейсов
Интерфейсы описывают действия (например, бег, подключение к базе данных или удаление файлов). Интерфейс определяет что нужно сделать (поля и методы), а не как. При добавлении действия к классу (например, бег к роботу), достаточно реализовать интерфейс – все необходимые поля и методы автоматически подключатся.
Реализация методов будет отличаться в зависимости от класса (бег робота отличается от бега машины). Интерфейс гарантирует реализацию необходимых методов, иначе возникнет ошибка компиляции.
Реализация нескольких интерфейсов
Создадим интерфейс IJump:
namespace Project
{
interface IJump
{
float Y { get; set; }
void Jump();
}
}
Класс Robot может реализовывать оба интерфейса:
namespace Project
{
class Robot : IRun, IJump
{
public float Speed { get; set; }
public void RobotRun() { Console.WriteLine("Робот бежит"); }
public float Y { get; set; }
public void Jump() { Console.WriteLine("Робот прыгнул"); }
}
}
Интерфейсы, проще абстрактных классов, описывают контракт для реализующих классов, позволяя одному классу реализовывать несколько интерфейсов одновременно. Это делает код более гибким, масштабируемым и читаемым.