Есть ли у вас опыт использования интерфейсов в C#?

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

Ответ

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

Пример базового интерфейса и его реализаций:

// Контракт для логирования
public interface ILogger
{
    void Log(string message);
}

// Реализация для консоли
public class ConsoleLogger : ILogger
{
    public void Log(string message) => Console.WriteLine($"[LOG] {DateTime.Now}: {message}");
}

// Реализация для файла
public class FileLogger : ILogger
{
    private readonly string _filePath;
    public FileLogger(string filePath) => _filePath = filePath;
    public void Log(string message) => File.AppendAllText(_filePath, $"{DateTime.Now}: {message}n");
}

Практическое использование и преимущества:

  1. Внедрение зависимостей (DI): Позволяет легко подменять реализации.
    public class OrderProcessor
    {
        private readonly ILogger _logger;
        // Внедряем зависимость через конструктор
        public OrderProcessor(ILogger logger) => _logger = logger;
        public void ProcessOrder() => _logger.Log("Order processed.");
    }
    // В контейнере DI можно зарегистрировать ILogger как FileLogger или ConsoleLogger.
  2. Множественное наследование: Класс может реализовывать несколько интерфейсов.
  3. Реализации по умолчанию (C# 8.0+): Интерфейсы могут содержать методы с реализацией, что помогает в эволюции API без ломающих изменений.
  4. Основы паттернов: Интерфейсы лежат в основе многих паттернов проектирования (Strategy, Adapter, Factory и др.).