我正在查看List<T>
的声明,并看到它实现了IList<T>
,ICollection<T>
和IEnumerable<T>
(以及其他)。
然后我去查看IList<T>
的定义,看到它实现了ICollection<T>
和IEnumerable<T>
。
如果一个接口实现另一个接口,那么它们的作用是什么?如果它们像#34; contract&#34;那样工作。我们没有写真正的代码吗?
此实施是累积的吗?如果是,由于IList<T>
实施ICollection<T>
和IEnumerable<T>
,List<T>
不应该只实施IList<T>
?
很抱歉,如果我的问题令人困惑,我现在有点困惑。
答案 0 :(得分:19)
如果是,实现另一个接口的接口有什么意义呢? 他们的工作就像&#34;合同&#34;我们没有给他们写真正的代码吗?
接口支持继承并以与类相同的方式促进多态性。 IList<T>
也是ICollection<T>
,与TextBox
为Control
的方式相同。
此实施是累积的吗?如果是,则自IList实现 ICollection和IEnumerable,List不应该只实现 的IList?
正如其他人所指出的,这主要是为了可读性和可维护性。是的,继承是累积的。但是,当一个类实现包含具有相同签名的成员的多个接口时,它只需要为所有实现定义一个成员。 Explicit interface implementation可用于明确定义给定实现的成员。
答案 1 :(得分:8)
至少可以减少冗余。
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>
。
您可以将前一个案例理解为&#34;某个INamedValuedObject<T>
的内容是INamedObject
,IValuedObject<T>
,还有以下元素&#34;