【问题标题】:Why do we need to implement interfaces to provide certain functionality instead of just defining the methods without implementing the interface? [duplicate]为什么我们需要实现接口来提供某些功能,而不是仅仅定义方法而不实现接口? [复制]
【发布时间】:2013-12-29 04:41:46
【问题描述】:

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

为什么我们需要实现这些接口来提供这个功能?难道我们不能只定义一个EqualsGetEnumeratorMoveNextResetClone方法而不实现接口吗?

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

【问题讨论】:

  • @CodeCaster:基本上,我同意,但我也认为与另一个问题相比,这是一个更好的问题(因为这个问题详细说明了为什么人们认为接口是不必要的)。 (当然,另一个问题的公认答案已经很好了。)
  • @O.R.Mapper 你是对的,其他问题可以更好地措辞,以使其成为参考“为什么使用接口”问题。

标签: c# oop inheritance


【解决方案1】:

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

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

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

编译器需要确保comparer.Compare 方法调用是有意义的——而且它只有确实有意义,因为IComparer&lt;T&gt; 指定了方法。您不会希望为实现适当Compare 方法的每个 类编写该方法...该接口允许我们表达类之间的共性,并编写Max once 方法来处理所有具有该共同行为的类。

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

【讨论】:

  • if it were dynamically typed, there wouldn't be a need for interfaces. 为什么不呢?
  • @user2609980:因为这样绑定到成员将在执行时动态完成。;
  • @user2609980:也许更准确的说法是:“编译代码不需要接口。”如果您想在编译时检查方法是否存在,仍然需要接口。
  • @O.R.Mapper:如果编译时检查方法是否存在,它就不会是动态类型语言,对吗? (通常动态类型的语言甚至不允许您为参数等指定类型)
  • @JonSkeet:是的 - 我应该读过你的完整句子 ;-) 我在想“动态类型的调用/动态类型的标识符”(作为一种选择,而不是作为整个语言的规则)。例如,允许在运行时解析的方法调用,同时确保某些其他方法调用已经可以在编译时根据接口实现进行验证。
【解决方案2】:

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

如需进一步了解,请查看:When to Use Interfaces

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多