Ответ
Для разрешения конфликта имен методов из разных интерфейсов используется явная реализация интерфейса (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");
Практический совет: Используйте явную реализацию, когда метод имеет разную семантику в разных интерфейсах, и вы хотите четко разделить это поведение в коде.