Почему интерфейс реализует другой интерфейс?
Я смотрел объявление 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>
, а также имеет следующие элементы".