为什么一个接口要实现另一个接口呢?
本文关键字:接口 实现 另一个 一个 为什么 | 更新日期: 2023-09-27 18:14:47
我正在查看List<T>
的声明,并看到它实现了IList<T>
, ICollection<T>
和IEnumerable<T>
(以及其他)。
然后我去看IList<T>
的定义,看到它实现了ICollection<T>
和IEnumerable<T>
。
如果一个接口实现另一个接口就像"契约"一样工作,我们不写真正的代码,那还有什么意义呢?
这个实现是累积的吗?如果是,既然IList<T>
实现了ICollection<T>
和IEnumerable<T>
,那么List<T>
不应该只实现IList<T>
吗?
对不起,如果我的问题让你困惑了,我现在有点困惑。
接口支持继承,并以与类相同的方式促进多态性。一个接口实现另一个接口有什么意义它们就像"契约"一样工作,我们不需要为它们编写真正的代码?
IList<T>
也是ICollection<T>
,就像TextBox
也是Control
一样。
正如其他人指出的那样,这主要是为了可读性和可维护性。是的,继承是累积的。但是,当一个类实现包含具有相同签名的成员的多个接口时,它只需要为所有实现定义一个成员。显式接口实现可用于显式定义给定实现的成员。这个实现是累积的吗?如果是,因为IList实现了icollections和IEnumerable, List不应该只实现IList接口?
至少可以减少冗余。
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>
,并且还具有以下元素"