实现接口的好处

时间:2009-09-07 13:29:42

标签: c# interface

在C#3.5中实现接口有什么好处?

10 个答案:

答案 0 :(得分:25)

您将能够将对象传递给期望接口作为参数的方法(或满足类型约束)。 C#不支持“duck typing”。只需编写接口定义的方法,该对象就不会自动与接口类型“兼容”:

public void PrintCollection<T>(IEnumerable<T> collection) {
    foreach (var x in collection)
       Console.WriteLine(x);
}

如果List<T>未实现IEnumerable<T>接口,您将无法将其作为PrintCollection方法的参数传递(即使它有GetEnumerator}法)。

基本上,界面声明合同。实现接口会强制您的类绑定到合同(通过提供适当的成员)。因此,依赖于该合同的所有内容(依赖于由对象提供的接口指定的功能的方法)也可以与您的对象一起使用。

答案 1 :(得分:16)

主要好处是代码可读性,代码可维护性和代码“语义”。

  • 代码可读性:界面构成有关意图的声明。它定义了您的班级的能力,您的班级能够做什么。如果您实施了ISortable,那么您明确表示您的类可以进行排序,对于IRenderable或IConvertible也是如此。
  • 代码语义:通过提供接口并实现它们,您可以像HTML和CSS那样以类似的方式主动分离概念。类是“对象类”的具体实现,通过对现实生活对象或概念的一般属性进行建模来表示现实。接口定义行为模型,定义对象可以做什么。分离这些概念可以使代码的语义更加清晰。这样一些方法可能需要一个动物类的实例,而其他方法可能接受你扔给它们的任何对象,只要它支持“行走”。
  • 代码可维护性:接口有助于减少耦合,因此可以轻松地交换相同概念的实现,而不会影响底层代码。您可以通过定义实现接口的新类来轻松更改IMessage的实现。将其与sessically替换从CMessage到CMyNewMessageClass的所有引用进行比较。

答案 2 :(得分:11)

当你尝试:

时会有所帮助
  • 使用Stubs / Mocks进行单元测试
  • 实施依赖注入
  • 解决世界饥饿问题(虽然未经证实!)

善,

答案 3 :(得分:4)

接口没有实际优势。任何可以通过接口完成的事情都可以,并且应该使用其他语言结构来完成。多重继承被引用作为使用接口所获得的唯一真正的好处,但我可以在C#中非常容易和清楚地进行多重继承 - 我每天都这样做。在不“破坏”接口的情况下更改代码是所有借口中最愚蠢的......这对于具体类应用与抽象类或接口相同。只要功能签名没有改变,您就没有破坏界面。声明的地方无关紧要。简单地将一个功能原型放在一个单独的文件中并在前面用“I”命名它什么都不买 - 除了你最终要维护两倍的源文件。假设接口是早期定义的,然后维护合同是荒谬的。接口方法及其参数一直在变化,因为一切都是前所未有的。这就是为什么MicroSof很久以前就停止使用它们了。他们有IUnKnown,IUnknown2等等。它造成了一团糟。

答案 4 :(得分:3)

界面的主要好处主要与项目设计有关。

如果您使用界面:

  1. 接口的使用者应该实现该接口。
  2. 设计桥梁图案。
  3. 创建合同,以便用户必须遵守接口规则。
  4. 只能从主类中获取界面部分(Object)。
  5. 即使是类私有,也可以从那个
  6. 获取接口对象
  7. 多种继承风格。
  8. 无需应该实现,如果您想要实现其他方面的实现意味着简单可以删除它..
  9. 清洁代码。
  10. 依赖于类的实现可以继续使用接口。
  11. 如果每个类都有单独的方法实现,那么最好去接口。例如集合中的IEnumerable
  12. 根据C#Architect的说法,简单来说就是合约。消费者必须遵守它。

答案 5 :(得分:2)

接口定义了契约(对象能够做的事情),而具体的类(或结构)定义了具体的行为。

例如,IList是一个接口,它定义了具体对象必须提供的方法,以便像实现IList的任何其他对象一样使用。在任何地方都可以使用IList,也可以使用实现IList的对象。具体实现它的方式以及调用这些IList方法时对象的行为方式留给你。

答案 6 :(得分:2)

如果你在一个巨大的商业软件公司工作 - 你可能会考虑使用Interfaces的司法用途。否则,你应该远离他们。多线程也是如此。如果我看到另外一个脚本小子应用程序产生20个线程来写“Hello World”我会变得怪异。多线程应该完全保留给需要它的应用程序,通常是在多处理环境中。 90%的时间它造成的伤害大于好处。并且不要打扰线程highjack / off-topic注释。我不在乎。我这样做的时间比你们大多数人还活着的时间要长。 Rank有其特权。

答案 7 :(得分:1)

您不依赖于类继承 - 您可以将接口应用于任何类。任何类都可以有多个接口--C#不支持多类继承,即你通过接口提供了一个很好的抽象层

答案 8 :(得分:1)

接口是一种引用类型,它只包含抽象成员。 Interface的成员可以是事件,方法,属性和索引器。但是界面仅包含其成员的声明。任何实现都必须放在实现它们的类中。接口不能包含常量,数据字段,构造函数,析构函数和静态成员。接口内的所有成员声明都是隐式公共的。

答案 9 :(得分:0)

我理解它的方式接口在这些情况下最有用:

  1. 程序员之间更清洁的分工。首席程序员编写接口,初级程序员编写其实现。这对我来说非常有意义。首席程序员可以编写伪代码而不是接口。

  2. 某些特定情况,您需要两个或更多同一类的不同实现,例如界面动物和使用它的虎和狮子类。即使在这里它也没有多大意义,因为狮子和老虎有一些共同点。抽象类会更好,因为如果使用接口,则必须在单独的类中编写公共函数,这会导致代码重复,这很糟糕。

  3. 您编写了一个库,并希望用户可以对其进行修改。所以你编写接口及其类实现。你的lib的用户仍然可以编写自己的实现类,它可以使用不同的技术/算法来实现相同的结果,但可能以更快的方式。这也是我们在我们使用的libs中遇到如此多接口的原因,但很少有人觉得需要编写我们自己的接口。因为我们不会写图书馆。