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

C# 为什么我们需要实现接口来提供某些功能,而不是只定义方法而不实现接口?,c#,oop,inheritance,C#,Oop,Inheritance,IComparable类提供了一个CompareTo方法,用于比较两个对象并确定 它们的排序,一个IEquatable类提供了一个Equals方法来确定一个对象是否等于另一个对象,IEnumerable类提供了一个GetEnumerator方法,该方法返回一个IEnumerator对象,该对象具有MoveNext和Reset方法,用于在对象列表中移动;ICloneable类提供了一个Clone方法,该方法返回一个对象的副本,等等 为什么我们需要实现这些接口来提供此功能?在不实现接口的情况下,我们

IComparable
类提供了一个
CompareTo
方法,用于比较两个对象并确定 它们的排序,一个
IEquatable
类提供了一个
Equals
方法来确定一个对象是否等于另一个对象,
IEnumerable
类提供了一个
GetEnumerator
方法,该方法返回一个
IEnumerator
对象,该对象具有
MoveNext
Reset
方法,用于在对象列表中移动;
ICloneable
类提供了一个
Clone
方法,该方法返回一个对象的副本,等等

为什么我们需要实现这些接口来提供此功能?在不实现接口的情况下,我们是否可以定义
Equals
GetEnumerator
MoveNext
Reset
Clone
方法

我怀疑这与同时使用两个对象(例如,用于比较)有关,您需要某种总体类来实现这一点,但我不能对此掉以轻心。或者,该接口确实提供了一些否则不可能实现的额外功能(例如,IDisposable有时似乎是必要的标记)?我希望有人能解释为什么每个人都实现接口,而不仅仅是在类本身中提供功能

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

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

public T Max<T>(T first, T second, IComparer<T> comparer)
{
    return comparer.Compare(first, second) > 0 ? first : second;
}
public T Max(T first,T second,i比较程序)
{
返回比较器。比较(第一,第二)>0?第一:第二;
}
编译器需要确保
comparer.Compare
方法调用是有意义的,而且它只有在
IComparer
指定方法时才有意义。您不必为实现适当的
Compare
方法的每个类编写该方法。。。接口允许我们表示类之间的公共性,并编写一次
Max
方法来处理具有该公共行为的所有类

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

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

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

public T Max<T>(T first, T second, IComparer<T> comparer)
{
    return comparer.Compare(first, second) > 0 ? first : second;
}
public T Max(T first,T second,i比较程序)
{
返回比较器。比较(第一,第二)>0?第一:第二;
}
编译器需要确保
comparer.Compare
方法调用是有意义的,而且它只有在
IComparer
指定方法时才有意义。您不必为实现适当的
Compare
方法的每个类编写该方法。。。接口允许我们表示类之间的公共性,并编写一次
Max
方法来处理具有该公共行为的所有类

这是因为C#是一种静态类型的语言——如果它是动态类型的,就不需要接口了。

你触及了它的基础。 您不必在任何地方都使用接口,但这是一种建议的抽象设计模式,它让您的应用程序易于扩展,并可长期维护

要进一步了解,您可以查看:

您触摸的基础。 您不必在任何地方都使用接口,但这是一种建议的抽象设计模式,它让您的应用程序易于扩展,并可长期维护


为了进一步了解,您可以查看:

如果它是动态键入的,那么就不需要接口。
为什么不需要?@user2609980:因为这样,到成员的绑定将在执行时动态完成@user2609980:也许更准确的说法是:“编译代码时不需要接口。”如果您希望在编译时检查方法是否存在,则仍然需要接口。@O.R.Mapper:如果在编译时检查方法是否存在,则它将不是一种动态类型的语言,会吗?(通常,动态类型语言甚至不允许您为参数等指定类型。)@JonSkeet:True-我应该读一下您的完整句子;-)我考虑的是“动态类型调用/动态类型标识符”(作为选项,而不是作为整个语言的规则)。例如,允许在运行时解析的方法调用,同时确保某些其他方法调用可以在编译时根据接口实现进行验证。
如果它是动态类型的,不需要接口。
为什么不需要?@user2609980:因为这样,到成员的绑定将在执行时动态完成@user2609980:也许更准确的说法是:“编译代码时不需要接口。”如果您希望在编译时检查方法是否存在,则仍然需要接口。@O.R.Mapper:如果在编译时检查方法是否存在,则它将不是一种动态类型的语言,会吗?(通常,动态类型语言甚至不允许您为参数等指定类型。)@JonSkeet:True-我应该读一下您的完整句子;-)我想的是“动态输入”