Почему интерфейс реализует другой интерфейс?

Я смотрел объявление List<T> и видел, что он реализует IList<T>, ICollection<T> и IEnumerable<T> (среди прочих).

Затем я пошел посмотреть определение IList<T> и увидел, что он реализует ICollection<T> и IEnumerable<T>.

Какая точка интерфейса реализует другой интерфейс, если они работают так же, как "контракты", и мы не написали им никакого реального кода?

Является ли эта реализация кумулятивной? Если это так, поскольку IList<T> реализует ICollection<T> и IEnumerable<T>, List<T> не должен реализовывать только IList<T>?

Извините, если мой вопрос запутан, я сейчас немного озадачен.

Ответ 1

Какая точка интерфейса реализует другой интерфейс, если они работают так же, как "контракты", и мы не написали им никакого реального кода?

Интерфейсы поддерживают наследование и облегчают полиморфизм так же, как и классы. IList<T> также является ICollection<T>, таким же образом, что a TextBox является Control.

Является ли эта реализация кумулятивной? Если это так, поскольку IList реализует ICollection и IEnumerable, List не должен реализовывать только IList?

Как отмечали другие, это в основном для удобства чтения и обслуживания. Да, наследование является кумулятивным. Но, когда класс реализует несколько интерфейсов, которые содержат членов с одинаковой сигнатурой, ему нужно только определить один элемент для всех реализаций. Явная реализация интерфейса может использоваться для явного определения члена для данной реализации.

Ответ 2

По крайней мере, это уменьшает избыточность.

public interface INamedObject { string Name { get; } }
public interface IValuedObject<T> { T Value { get; } }
public interface INamedValuedObject<T> : INamedObject, IValuedObject<T> { }

Лучше дизайн, чем:

public interface INamedObject { string Name { get; } }
public interface IValuedObject<T> { T Value { get; } }
public interface INamedValuedObject<T> {
   string Name { get; }
   T Value { get; }
}

Кроме того, в последнем случае обратите внимание, что INamedValuedObject<T> теперь не является ни INamedObject, ни IValuedObject<T>.

Вы можете прочитать первый случай как "Что-то, что есть INamedValuedObject<T>, это то, что есть INamedObject, IValuedObject<T>, а также имеет следующие элементы".