Что такое интерфейсы в ООП и C#?

«Что такое интерфейсы в ООП и C#?» — вопрос из категории ООП, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс — это контракт, который определяет что должен уметь делать класс (или структура), но не определяет как это делать. Он содержит только сигнатуры методов, свойств, событий и индексаторов.

Ключевые принципы и преимущества:

  • Абстракция и контракт: Интерфейс скрывает детали реализации, оставляя только публичный API.
  • Полиморфизм: Код может работать с объектом через интерфейс, не зная его конкретного типа.
  • Слабая связанность: Компоненты зависят от абстракций (интерфейсов), а не от конкретных реализаций, что упрощает тестирование и замену.
  • Множественное "наследование": Класс может реализовать несколько интерфейсов.

Пример на C#:

// Контракт для возможности сохранения данных
public interface IDataSaver
{
    void Save(string data);
    string Load();
}

// Конкретная реализация для файловой системы
public class FileDataSaver : IDataSaver
{
    private string _filePath;
    public FileDataSaver(string filePath) => _filePath = filePath;

    public void Save(string data) => File.WriteAllText(_filePath, data);
    public string Load() => File.Exists(_filePath) ? File.ReadAllText(_filePath) : null;
}

// Конкретная реализация для базы данных (условно)
public class DatabaseDataSaver : IDataSaver
{
    public void Save(string data) { /* SQL-запрос на INSERT/UPDATE */ }
    public string Load() { /* SQL-запрос на SELECT */ return "data from db"; }
}

// Клиентский код зависит только от интерфейса
public class DataProcessor
{
    private readonly IDataSaver _saver;
    // Внедрение зависимости через интерфейс
    public DataProcessor(IDataSaver saver) => _saver = saver;

    public void Process()
    {
        // Работает с любой реализацией IDataSaver
        _saver.Save("processed result");
        var loaded = _saver.Load();
    }
}

Современное использование: Интерфейсы — основа Dependency Injection, модульного тестирования (мокирование) и архитектурных паттернов (Repository, Strategy).