为什么接口有用? (OOP)

时间:2013-04-11 01:24:44

标签: oop interface implements

我已经了解了工具和接口的基础知识。我不明白何时使用界面。有接口的要求是什么?

示例:

/// 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?");
}
}

这两个类具有相同的函数名称和不同的主体。这也可以在没有接口的情况下实现。使用方法参考的目的是什么?当我扩展一个超类时,至少我得到了超类的属性和方法。

请给我一个清晰的解释和现实世界的场景让我理解。

5 个答案:

答案 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)

使用接口的两个原因:

  1. 您需要多重继承,而您的编程语言不支持它(例如,Java,C#)。在这种情况下,您在派生类中继承的大多数(除了一个)基类都需要定义为接口类。

  2. 您希望使用某个类的多个实现。在这种情况下,类可以是抽象类或接口。您的客户端提供此类的特定具体实现,可能因客户端而异。接口(或抽象类)需要为每个实现提供相同的行为(方法)。

答案 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循环。