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

gab*_*ira 13 .net c# oop interface

我正在查看声明List<T>并看到它实现了IList<T>,ICollection<T>以及IEnumerable<T>(除其他外).

然后我去看看它的定义,IList<T>并看到它实现ICollection<T>IEnumerable<T>.

如果一个接口实现另一个接口,如果它们像"合同"一样工作并且我们没有编写真正的代码,它有什么意义呢?

这个实施是累积的吗?如果是这样,因为IList<T>工具ICollection<T>IEnumerable<T>,List<T>不仅要实现IList<T>

对不起,如果我的问题令人困惑,我现在有点困惑.

Pat*_*sel 19

如果一个接口实现另一个接口,如果它们像"合同"一样工作并且我们没有编写真正的代码,它有什么意义呢?

接口支持继承并以与类相同的方式促进多态性.一个IList<T>也是一个ICollection<T>,就像a TextBox是a一样Control.

这个实施是累积的吗?如果是,因为IList实现ICollection和IEnumerable,List不应该只实现IList?

正如其他人所指出的,这主要是为了可读性和可维护性.是的,继承是累积的.但是,当一个类实现包含具有相同签名的成员的多个接口时,它只需要为所有实现定义一个成员.显式接口实现可用于显式定义给定实现的成员.


Dav*_*eau 8

至少它减少了冗余.

public interface INamedObject { string Name { get; } }
public interface IValuedObject<T> { T Value { get; } }
public interface INamedValuedObject<T> : INamedObject, IValuedObject<T> { }
Run Code Online (Sandbox Code Playgroud)

设计比以下更好:

public interface INamedObject { string Name { get; } }
public interface IValuedObject<T> { T Value { get; } }
public interface INamedValuedObject<T> {
   string Name { get; }
   T Value { get; }
}
Run Code Online (Sandbox Code Playgroud)

此外,在后一种情况下,请注意a INamedValuedObject<T>现在既不是INamedObject也不是IValuedObject<T>.

您可以阅读在前一种情况下作为"的东西,是一个INamedValuedObject<T>是这是一个INamedObject,一个IValuedObject<T>,并且还具有以下要素".