Что делать, если в одном классе реализуются два интерфейса с методами одинакового имени?

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

Ответ

Для разрешения конфликта имен методов из разных интерфейсов используется явная реализация интерфейса (explicit interface implementation). Этот подход позволяет предоставить отдельные реализации для каждого интерфейса.

Ключевые моменты:

  • Метод, реализованный явно, не имеет модификатора доступа (public, private и т.д.).
  • Вызвать такой метод можно только через переменную, приведенную к типу конкретного интерфейса.
  • Это единственный чистый способ в C# решить данную проблему без изменения сигнатур методов в интерфейсах.

Пример:

interface ILogger
{
    void Write(string message);
}

interface IDebugger
{
    void Write(string message);
}

class MultiWriter : ILogger, IDebugger
{
    // Стандартная (неявная) реализация для ILogger
    public void Write(string message)
    {
        Console.WriteLine($"[LOG] {message}");
    }

    // Явная реализация для IDebugger
    void IDebugger.Write(string message)
    {
        Console.WriteLine($"[DEBUG] {message}");
    }
}

// Использование:
var writer = new MultiWriter();

// Вызывает реализацию ILogger.Write
writer.Write("Application started");

// Для вызова IDebugger.Write требуется приведение
((IDebugger)writer).Write("Checking state");

// Или через переменную интерфейсного типа
IDebugger debugWriter = writer;
debugWriter.Write("Debug info");

Практический совет: Используйте явную реализацию, когда метод имеет разную семантику в разных интерфейсах, и вы хотите четко разделить это поведение в коде.