为什么接口会实现另一个接口?

时间:2014-07-24 22:54:47

标签: c# .net oop interface

我正在查看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>

很抱歉,如果我的问题令人困惑,我现在有点困惑。

2 个答案:

答案 0 :(得分:19)

  

如果是,实现另一个接口的接口有什么意义呢?   他们的工作就像&#34;合同&#34;我们没有给他们写真正的代码吗?

接口支持继承并以与类相同的方式促进多态性。 IList<T>也是ICollection<T>,与TextBoxControl的方式相同。

  

此实施是累积的吗?如果是,则自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>的内容是INamedObjectIValuedObject<T>,还有以下元素&#34;