4

我已经知道实现和接口的基础知识。我不明白什么时候使用接口。有接口的要求是什么?

例子:

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

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

请给我一个清晰的解释和一个真实的世界场景,以便我很好地理解。

4

5 回答 5

3

如果需要多重继承,则需要一个接口。

假设您有一个需要可比较的类和一个列表。由于在某些语言中只能继承一个类,为了向编译器证明它同时具有 Comparable 的 compareTo() 方法和 List 的 add() 方法,就需要接口。这是最简单的解释,但我相信其他人会给出更多理由。

在某些情况下,接口也使多重继承更容易,因为“在后台”没有任何事情发生。他们只指定对象需要在方法方面提供什么。

于 2013-04-11T01:29:11.427 回答
3

首先,他们为用户提供了一个合约,因此用户不需要知道使用了什么底层实现,而只需要知道合约。如果底层实现发生变化,这会产生松散耦合。

现实世界的例子

通过这种方式,我们可以使用某些模式,例如策略和命令模式:使用策略模式和命令模式

策略模式的真实示例

命令模式应用的真实世界示例

抽象类和接口之间的区别

关于抽象类可以说大部分内容,请参见此处了解差异:接口与抽象类(一般 OO)

于 2013-04-11T01:44:42.593 回答
2

使用接口的两个原因:

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

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

于 2013-04-12T16:59:10.107 回答
1

我相信使用接口最重要的原因之一是类型匹配。通过对接口而不是实现进行编程,您的程序可以更加灵活。

您可以查看不同的设计模式(我建议您从 Strategy Pattern 开始,http ://en.wikipedia.org/wiki/Strategy_pattern#Example )我认为您将立即了解程序到接口如何使您的代码更加灵活。

希望这能有所帮助。

于 2013-05-12T12:16:44.353 回答
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 方法中。在这样一个简单的例子中,这似乎没什么大不了的。如果您查看跳跳虎答案中发布的链接,您会发现这在哪里变得非常有用。

这特别有用的一种情况是单元测试。你可以有一个业务逻辑类,它接受一个数据层对象的接口。当应用程序运行时,业务逻辑类被传递一个真实数据层对象的实例。当类被单元测试时,它被传递一个返回测试数据的对象的实例。这允许单元测试以可预测的数据输入运行。这在依赖注入中是已知的。

另一个有用的情况是当您想要与框架或第三方代码交互时。假设您要实现自定义集合。如果您的类实现了 IEnumerable 接口,则可以在 foreach 循环中遍历集合中的项目。框架不需要知道您的类如何存储项目或项目中的内容,但如果它知道您实现了 IEnumerable,它可以允许您使用 foreach 循环。

于 2013-04-12T16:42:32.477 回答