C# для новичков: Интерфейсы и их применение

Интерфейсы и абстрактные классы

Интерфейсы похожи на абстрактные классы: создать объект на основе интерфейса нельзя. В интерфейсах описываются методы и поля, но не реализуются. Реализация происходит в классах, реализующих интерфейс. Важное отличие: класс может реализовывать несколько интерфейсов (в отличие от единичного наследования от класса).

Создание интерфейса

Создадим интерфейс 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("Робот прыгнул"); }
    }
}

Интерфейсы, проще абстрактных классов, описывают контракт для реализующих классов, позволяя одному классу реализовывать несколько интерфейсов одновременно. Это делает код более гибким, масштабируемым и читаемым.

Что будем искать? Например,программа