当我们需要接口c#时

时间:2012-08-05 06:16:09

标签: c#

  

可能重复:
  Why would I want to use Interfaces?   Why I need Interface?

我想知道何时何地使用它?

例如,

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

这两个类具有相同的函数名称和不同的主体。 没有接口,甚至可以实现这一点。 那么为什么我们需要一个接口何时何地使用它?

3 个答案:

答案 0 :(得分:1)

在您的简单情况下,您可以通过使用实现show()的公共基类(或者可能将其定义为抽象)来实现与接口相似的操作。让我将您的通用名称更改为更具体的名称, Eagle Hawk ,而不是 MyClass1 MyClass2 。在这种情况下,您可以编写类似

的代码
Bird bird = GetMeAnInstanceOfABird(someCriteriaForSelectingASpecificKindOfBird);
bird.Fly(Direction.South, Speed.CruisingSpeed);

这使您可以编写可以处理 * Bird *的任何内容的代码。然后,您可以编写导致 Bird 执行此操作的代码(飞行,吃饭,产蛋等等),这些代理会作用于 Bird 的实例。无论 Bird Eagle Hawk ,还是从 Bird 派生的任何其他内容,该代码都能正常工作。< / p>

然而,当你没有真正的关系时,这种模式开始变得混乱。假设您想编写在天空中飞行的代码。如果您编写该代码以接受 Bird 基类,则突然变得很难将该代码发展为 JumboJet 实例,因为当 Bird JumboJet 当然都可以飞, JumboJet 肯定不是 Bird

输入界面。

Bird (以及 Eagle Hawk 的共同点是,他们都可以飞。如果您编写上述代码而不是作用于接口 IFly ,则该代码可以应用于为该接口提供实现的任何内容。

答案 1 :(得分:0)

以下是一些很好的链接。

http://www.daniweb.com/software-development/csharp/threads/114364/why-use-interfaces

http://fci-h.blogspot.com/2008/03/oop-design-concepts-interfaces_05.html

详细说明:基本上它们提供了更多的抽象。如果你有一个物体说Alien,在这种情况下,所有外星人都来自外太空。不是所有外星人都完全相同,但他们都消耗食物和使用能量。他们消费食物和使用能量的方式可能不同,但保留一个基础Alien类,并且具有抽象远离该类的接口比为每种类型具有单独的类更有意义。

核心逻辑可以在基类中保持相同,并且接口可以在需要时更改部件。

答案 2 :(得分:0)

当您拥有彼此依赖的组件时,通常需要接口。 一个常见的例子是日志记录控制器和一些记录器类。

class LoggingController {

    private ILogger _logger

    // expecting an interface here removes the dependency 
    // to a specific implemenentation.
    // all it cares about is that the object has a Log() method
    public LoggingController(ILogger logger) {
        _logger = logger;
    }

    public void Log() { _logger.Log(); }
}

interface ILogger { 
    void Log(); 
}

class DbLogger : ILogger { 
    public void Log(){ //log into db }
}

class TxtLogger : ILogger {
    public void Log(){ //log into a txt file }
}

在运行时,日志记录控制器可以注入ILogger的任何实现,并且它完全不知道记录器实际上记录了什么。

编程接口的另一个好处是它允许更容易的单元测试。 通过注入一个也可以实现接口的模拟记录器,可以轻松地对控制器进行单元测试。