我已经了解了工具和接口的基础知识。我不明白何时使用界面。有接口的要求是什么?
示例:
/// Interface demo
Interface IDemo
{
// Function prototype
public void Show();
}
// First class using the interface
Class MyClass1 : IDemo
{
public void Show()
{
// Function body comes here
Response.Write("I'm in MyClass");
}
}
// Second class using the interface
Class MyClass2 : IDemo
{
public void Show()
{
// Function body comes here
Response.Write("I'm in MyClass2");
Response.Write("So, what?");
}
}
这两个类具有相同的函数名称和不同的主体。这也可以在没有接口的情况下实现。使用方法参考的目的是什么?当我扩展一个超类时,至少我得到了超类的属性和方法。
请给我一个清晰的解释和现实世界的场景让我理解。
答案 0 :(得分:3)
如果需要多重继承,则需要一个接口。
假设您有一个需要Comparable的类,还有一个List。由于您只能在某些语言中继承一个类,为了向编译器证明它同时具有Comparable的compareTo()方法以及List的add()方法,您需要接口。这是最简单的解释,但我相信其他人会给出更多理由。
在某些情况下,接口也可以使多重继承更容易,因为“在后台”没有任何内容。它们只根据方法指定对象需要提供的内容。
答案 1 :(得分:3)
首先,他们为用户提供合同,因此用户不需要知道使用什么底层实施,而只需要知道合同。如果底层实现发生变化,这会产生松耦合。
通过这种方式,我们可以使用某些模式,如策略和命令模式:Using a strategy pattern and a command pattern
Real World Example of the Strategy Pattern
Real world example of application of the command pattern
关于抽象类的大部分内容可以说,请参阅此处的差异:Interface vs Abstract Class (general OO)
答案 2 :(得分:2)
使用接口的两个原因:
您需要多重继承,而您的编程语言不支持它(例如,Java,C#)。在这种情况下,您在派生类中继承的大多数(除了一个)基类都需要定义为接口类。
您希望使用某个类的多个实现。在这种情况下,类可以是抽象类或接口。您的客户端提供此类的特定具体实现,可能因客户端而异。接口(或抽象类)需要为每个实现提供相同的行为(方法)。
答案 3 :(得分:1)
我认为使用接口最重要的原因之一是类型匹配。通过编程到接口而不是实现,您的程序可以更加灵活。
你可以看看不同的设计模式(我建议你从策略模式开始,http://en.wikipedia.org/wiki/Strategy_pattern#Example)我认为你会立即明白程序接口如何使你的代码更灵活。
希望这可以提供帮助。
答案 4 :(得分:0)
大部分功能来自于对象可以由接口类型的变量引用的事实。这有点微妙变化。
private foo()
{
IDemo demoOne = new MyClass1();
IDemo demoTwo = new MyClass2();
}
这可以变得有力,因为您可以封装不同的行为。例如:
private foo(bool option)
{
IDemo demo = option ? new MyClass1() : new MyClass2();
}
private bar (IDemo demo)
{
demo.Show();
}
现在bar可以使用IDemo对象而无需知道传入IDemo的具体实现。关于使用哪个实现的决定封装在foo方法中。在这么简单的例子中,这似乎不是什么大问题。如果你查看tigger答案中发布的链接,你会看到它在哪里变得非常有用。
这个特别有用的一个案例是单元测试。您可以拥有一个业务逻辑类,该类将接口连接到数据层对象。当应用程序运行时,业务逻辑类将传递实际数据层对象的实例。当类经过单元测试时,会传递一个返回测试数据的对象实例。这允许单元测试以可预测的数据输入运行。这在依赖注入中是已知的。
另一个有用的案例是您希望与框架或第三方代码进行交互。假设您要实现自定义集合。如果您的类实现了IEnumerable接口,则可以在foreach循环中遍历集合中的项。框架不需要知道您的类如何存储项目或项目中的内容,但如果它知道您实现了IEnumerable,它可以允许您使用foreach循环。