实现接口的好处

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

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

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

如果List没有实现IEnumerable接口,则无法将其作为参数传递给PrintCollection方法(即使它具有GetEnumerator方法)。

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

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

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

当你尝试:

  • 使用Stubs / Mocks进行unit testing
  • 实现dependency injection
  • 解决世界饥饿问题(虽然未经证实!)

善良,

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

接口的主要好处主要与项目设计有关。

如果您使用界面:

  1. 接口的使用者应该实现该接口。
  2. 设计桥梁图案。
  3. 创建合同以便用户必须遵守接口规则。
  4. 只能从主类中获取接口部分( Object )。
  5. 即使类是私有的,也可以从中获取接口对象
  6. 多重inheritance的风格。
  7. 不需要实现,如果你想要你可以实现其他明智的实现意味着简单可以删除它。
  8. 更清洁的代码。
  9. 改变的实现取决于类可以继续接口。
  10. 如果每个类都有单独的方法实现,那么最好去接口。 例如IEnumerable在集合中。

根据C#Architect的说法,简单来说就是契约。 消费者必须遵守它。

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

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

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

您不依赖于类inheritance – 您可以将接口应用于任何类。 任何类都可以有多个接口–C#不支持多类inheritance,即通过接口提供良好的抽象层

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

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

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

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

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