IComparable
类提供了一个CompareTo
方法,用于比较两个对象并确定
对于它们的排序,IEquatable
类提供了一个Equals
方法来确定一个对象是否等于另一个对象,IEnumerable
类提供了一个返回{{1}的GetEnumerator
方法具有IEnumerator
和MoveNext
方法的对象用于移动对象列表,Reset
类提供返回对象副本的ICloneable
方法,等等
为什么我们需要实现这些接口来提供此功能?我们不能在不实现接口的情况下定义Clone
,Equals
,GetEnumerator
,MoveNext
和Reset
方法吗?
我怀疑这与一次使用两个对象有关(例如,用于比较),你需要某种总体类来做这件事,但我无法绕过它。或者接口确实提供了一些额外的功能,否则这些功能是不可能的(例如,IDisposable似乎有时候是必要的标记)?我希望有人可以解释为什么每个人都实现接口而不仅仅是在类本身中提供功能。
答案 0 :(得分:5)
为什么我们需要实现这些接口来提供此功能?
因此,可以根据接口编写其他代码,并使用实现接口的类型的对象,而无需了解特定类型。编译器在编译时确保相关成员存在。例如,请考虑以下方法:
public T Max<T>(T first, T second, IComparer<T> comparer)
{
return comparer.Compare(first, second) > 0 ? first : second;
}
编译器需要确保comparer.Compare
方法调用有意义 - 并且只有 才有意义,因为IComparer<T>
指定了方法。您不希望必须为实现适当的Compare
方法的每个类编写该方法...该接口允许我们表达类之间的共性,并编写{ {1}}方法一次来处理具有该常见行为的所有类。
这是因为C#是一种静态类型语言 - 如果它是动态类型的,则不需要接口。
答案 1 :(得分:1)
您触及Object oriented design的基础。 你不必必须在任何地方使用接口,但这是一个建议的抽象设计模式,让你的应用程序可以轻松扩展并且可以长期维护。
为了进一步了解,请查看:When to Use Interfaces