需要c#中的接口

时间:2009-10-25 12:29:41

标签: c# interface

c#中的接口需要什么?因为我们在接口中编写抽象方法。而不是我们可以在课堂上直接实现这些方法。

12 个答案:

答案 0 :(得分:7)

接口不支持实现,因此您无法使用抽象类提供任何默认实现。此外,接口不限于层次结构,因此它们比抽象类更灵活。

答案 1 :(得分:4)

您不需要在C#中使用接口。它们在某些情况下很有用且适用,但在所有情况下则不适用。我使用的一个方便的经验法则是,如果在您的项目中,您只有一个实现接口的类,则不需要该接口。

注意:这个经验法则的一个可能的反对意见是,您可能需要在将来编写第二个实现类,这可能证明使用该接口是合理的。我不一定同意,因为我认为编程中花费了相当多的时间来预测未来实现的未来情景。

答案 2 :(得分:2)

您可能需要阅读polymorphism

答案 3 :(得分:1)

对于我自己,当我有相似的对象但完全不同的相同方法的实现时,我发现接口有很多用途。

此外,您可以实现多个接口,但只继承一个抽象类。我发现这非常有用,因为我的业务对象具有更好的表示。

在编写任何将业务逻辑与演示文稿分开的N层应用程序时,我认为您将开始发现接口的许多用途。

答案 4 :(得分:1)

完全按照书中所述需要接口:定义组件之间的契约。它们是在保留封装的同时将某些功能暴露给其他模块的最佳方式之一。

例如:

1)尝试在没有接口的情况下,将程序集“A”中实现的某些功能暴露给程序集“B”,而程序集“A”没有实际可用的实现。

2)更糟糕的是 - 如果我们考虑.NET远程处理方案,服务器必须暴露某些情况 客户端的功能,而功能是在服务器端实现和托管的。在这种情况下,程序集将发布到客户端,其中定义了服务器托管类的接口。

答案 5 :(得分:0)

将接口视为合约。

您创建一个类必须遵循的合同。例如,如果我们的Dog对象必须具有Walk方法,那么它的定义类必须实现此方法。

为了强制每个dog类(继承或不继承)实现此方法,必须使它们遵守一个契约,即指定一个指定该方法的接口。

接口是一种构造,它强制执行特定的类以遵循严格的实现规则。

这样做的原因是你最终得到了Dog对象(继承或不继承),现在默认情况下有一个Walk方法。这意味着你可以将这些对象作为参数传递,安全地知道你可以在任何Dog类上调用Walk方法(继承或不继承),并且它将被实现。

答案 6 :(得分:0)

如果要编写可测试代码,通常需要使用接口。单元测试时,您可能拥有依赖于ClassB的ClassA,这取决于ClassC等,但您只想测试ClassA。您当然不希望创建一个ClassC来传递给ClassB只是为了实例化ClassA。

在这种情况下,你使ClassA依赖于IClassB(或一些更通用的名称,很可能并不暗示有关ClassB实现的任何内容)并在测试中模拟出IClassB。

关于我的依赖管理。

答案 7 :(得分:0)

当您想要将不同的类集视为同一类型的对象时,您需要接口。比如说,您有一组所有类都从文件中读取其配置。处理此问题的一种方法是让所有类实现适当的方法来从文件中读取配置。这样做的问题在于,那些使用这些类并想要配置它们的代码需要知道所有不同的类,以便它可以使用它们的方法。

另一种方法是让它们都来自单个基类。这样,使用类的任何代码只需要知道基类 - 它可以将任何派生类视为基类,并使用基类中定义的那些方法来进行配置。这不是很糟糕,但它有一个主要的缺点 - 因为C#不支持多重继承 - 限制你的继承链。如果你希望能够为某些类提供相同的能力,但是对于不同的行为而言并非所有类都具有相同的能力,那么无论如何你都无法为所有这些类实现它。不好。

最后一种方法是使用接口来定义行为。任何想要实现该行为的类只需要实现该接口。任何想要使用该行为的类只需要知道接口,然后可以使用任何实现它的类。类可以实现任何接口甚至多个接口,因此您可以在类之间进行细粒度的“分配”操作。您仍然可以使用基类和继承层次结构以共享方式提供类的主要行为,但是该类也可以自由地实现其他接口以为自己提供更多行为,并且仍然保留使用它的类的便利性关于界面。

答案 8 :(得分:0)

接口允许实现者使用自己的基类。对于抽象类,实现者被迫使用给定的基类来实现接口,即使实际上对实现者使用特定于项目的基类实际上更有意义。

答案 9 :(得分:0)

接口用于定义类的行为/属性,而不指定实现。如果您开始将类视为履行角色而不仅仅是一组方法和属性,那么您可以开始使用接口为类分配多个角色 - 这在C#中使用直接继承是不可能的,因为您只能从单个类继承。通过使类的客户端依赖于接口(角色)而不是类本身,您的代码将更松散地耦合并且可能更好地设计。

这样做的另一个好处是,如果你正在编写单元测试,他们更有可能专注于行为而不是状态。对接口进行编码使得为此类测试进行模拟/存根实现变得非常容易。

并非一切都需要接口 - 但大多数行为可能(即不仅仅是一组数据)应该让它们恕我直言,因为你总会有两个实现:你的应用程序中的一个实现和一个或多个假的实现在你的测试中。

答案 10 :(得分:0)

Interface是一个定义功能签名的合同。所以,如果一个班级正在实施 它向外界说明了它提供了特定的行为。

如果是一个类的示例 实现'Idisposable'接口意味着它具有释放非托管的功能 资源。现在使用此类的外部对象知道它具有可以配置的契约 未使用的非托管对象。

答案 11 :(得分:0)

由GoF第一原则提出:编程到接口而不是实现。

这在很多方面都有帮助。更改实现更容易,更容易使代码可测试等等......

希望这会有所帮助。

相关问题