为什么我们需要实现接口来提供某些功能,而不是仅仅定义方法而不实现接口?

Erw*_*ers 0 c# oop inheritance

IComparable类提供了一个CompareTo比较两个对象并确定它们的顺序,一个方法IEquatable类提供一种Equals用于确定对象是否等于另一个对象方法,IEnumerable类提供一个GetEnumerator返回一个方法IEnumerator,其具有对象MoveNextReset用于通过对象的列表移动方法,ICloneable类提供了一个Clone返回对象副本的方法,等等.

为什么我们需要实现这些接口来提供此功能?难道我们不只是定义Equals,GetEnumerator,MoveNext,Reset,和Clone方法,无需实现接口?

我怀疑这与一次使用两个对象有关(例如,用于比较),你需要某种总体类来做这件事,但我无法绕过它.或者接口确实提供了一些额外的功能,否则将无法实现(例如,IDisposable似乎有时是必要的标记)?我希望有人可以解释为什么每个人都实现接口而不是仅仅提供类本身的功能.

Jon*_*eet 5

为什么我们需要实现这些接口来提供此功能?

因此,可以根据接口编写其他代码,并在不知道特定类型的情况下使用实现接口的类型的对象.编译器在编译时确保相关成员存在.例如,考虑这种方法:

public T Max<T>(T first, T second, IComparer<T> comparer)
{
    return comparer.Compare(first, second) > 0 ? first : second;
}
Run Code Online (Sandbox Code Playgroud)

编译器需要确保该comparer.Compare方法的调用是有道理的-它只是确实很有道理,因为IComparer<T>指定的方法.您不希望必须为实现适当方法的每个类编写该方法Compare...接口允许我们表达类之间的共性,并编写一次Max方法来处理具有该常见行为的所有类.

这是因为C#是一种静态类型语言 - 如果它是动态类型的,则不需要接口.