Сколько интерфейсов может реализовать класс в C#?

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

Ответ

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

Пример:

public interface ILoggable { void Log(string message); }
public interface ISerializable { string ToJson(); }
public interface IIdentifiable { Guid Id { get; } }
public interface ICacheable { TimeSpan CacheDuration { get; } }

// Класс реализует четыре различных интерфейса.
public class UserEntity : ILoggable, ISerializable, IIdentifiable, ICacheable
{
    public Guid Id { get; set; }
    public TimeSpan CacheDuration => TimeSpan.FromMinutes(5);

    public void Log(string message) => Console.WriteLine($"[User {Id}]: {message}");
    public string ToJson() => System.Text.Json.JsonSerializer.Serialize(this);
}

Важные нюансы:

  • Явная реализация интерфейса (Explicit Interface Implementation): Используется, если у разных интерфейсов есть члены с одинаковыми именами и сигнатурами, чтобы разрешить неоднозначность.

    interface I1 { void Draw(); }
    interface I2 { void Draw(); }
    
    class Shape : I1, I2
    {
        void I1.Draw() { Console.WriteLine("Drawing for I1"); }
        void I2.Draw() { Console.WriteLine("Drawing for I2"); }
    }
  • Наследование интерфейсов: Один интерфейс может наследовать от нескольких других. В этом случае класс, реализующий производный интерфейс, должен реализовать члены всех базовых интерфейсов.
  • Практическое ограничение: Здравый смысл и принципы проектирования (например, Interface Segregation Principle — ISP). Класс, реализующий десятки интерфейсов, скорее всего, нарушает ISP и имеет слишком много ответственностей. Интерфейсы должны быть узконаправленными и специфичными.