为什么一个接口要实现另一个接口呢?

本文关键字:接口 实现 另一个 一个 为什么 | 更新日期: 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>,并且还具有以下元素"