在C#3.5中实现接口有什么好处?
答案 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)
主要好处是代码可读性,代码可维护性和代码“语义”。
答案 2 :(得分:11)
当你尝试:
时会有所帮助善,
丹
答案 3 :(得分:4)
接口没有实际优势。任何可以通过接口完成的事情都可以,并且应该使用其他语言结构来完成。多重继承被引用作为使用接口所获得的唯一真正的好处,但我可以在C#中非常容易和清楚地进行多重继承 - 我每天都这样做。在不“破坏”接口的情况下更改代码是所有借口中最愚蠢的......这对于具体类应用与抽象类或接口相同。只要功能签名没有改变,您就没有破坏界面。声明的地方无关紧要。简单地将一个功能原型放在一个单独的文件中并在前面用“I”命名它什么都不买 - 除了你最终要维护两倍的源文件。假设接口是早期定义的,然后维护合同是荒谬的。接口方法及其参数一直在变化,因为一切都是前所未有的。这就是为什么MicroSof很久以前就停止使用它们了。他们有IUnKnown,IUnknown2等等。它造成了一团糟。
答案 4 :(得分:3)
界面的主要好处主要与项目设计有关。
如果您使用界面:
Object
)。IEnumerable
。根据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)
我理解它的方式接口在这些情况下最有用:
程序员之间更清洁的分工。首席程序员编写接口,初级程序员编写其实现。这对我来说非常有意义。首席程序员可以编写伪代码而不是接口。
某些特定情况,您需要两个或更多同一类的不同实现,例如界面动物和使用它的虎和狮子类。即使在这里它也没有多大意义,因为狮子和老虎有一些共同点。抽象类会更好,因为如果使用接口,则必须在单独的类中编写公共函数,这会导致代码重复,这很糟糕。
您编写了一个库,并希望用户可以对其进行修改。所以你编写接口及其类实现。你的lib的用户仍然可以编写自己的实现类,它可以使用不同的技术/算法来实现相同的结果,但可能以更快的方式。这也是我们在我们使用的libs中遇到如此多接口的原因,但很少有人觉得需要编写我们自己的接口。因为我们不会写图书馆。