为什么界面有用?(OOP)

为什么界面有用?(OOP),oop,interface,implements,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

我已经知道了实现和接口的基本原理。我不明白什么时候使用接口。有接口的要求是什么

例如:

/// 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?");
}
}
这两个类具有相同的函数名和不同的实体。这也可以在没有接口的情况下实现。方法引用的目的是什么?当我扩展一个超类时,至少我得到了超类的属性和方法


请给我一个清晰的解释和一个真实的场景,让我更好地理解。

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

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


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

首先它们为用户提供契约,因此用户不需要知道使用的是什么底层实现,而只需要知道契约。这会在底层实现发生更改时产生松散耦合

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

抽象类与接口的区别
这在很大程度上可以说是关于抽象类的,请看这里的区别:

大部分功能来自这样一个事实,即对象可以被接口类型的变量引用。这是微妙的变化

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

使用接口的两个原因:

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

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


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

    您可以看看不同的设计模式(我建议您从策略模式开始),我想您将立即了解程序到接口如何使代码更灵活


    希望这能有所帮助。

    (这是一个java示例,但CSharp与之类似)