-1

可能重复:
我为什么要使用接口? 为什么我需要接口?

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

例如,

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

3 回答 3

1

show()在您的简单情况下,您可以通过使用实现(或可能将其定义为抽象)的公共基类来实现与接口所获得的类似的东西。让我将您的通用名称更改为更具体的名称,EagleHawk而不是MyClass1MyClass2。在这种情况下,您可以编写如下代码

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

这使您可以编写可以处理任何*Bird*的代码。然后,您可以编写代码,使Bird执行其作用于它视为Bird的实例的事情(飞行、进食、产卵等) 。无论Bird是否真的是EagleHawk或其他任何从Bird派生的东西,该代码都可以使用。

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

进入界面。

Bird (和EagleHawk)的共同点是它们都能飞如果您编写上面的代码而不是作用于接口IFly,则该代码可以应用于任何提供该接口实现的东西。

于 2012-08-05T06:25:05.293 回答
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 的任何实现,并且它完全不知道记录器实际执行什么来实际记录内容。

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

于 2012-08-05T06:27:21.187 回答
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类并拥有从该类抽象出来的接口比为每种类型都有单独的类更有意义。

核心逻辑可以在基类中保持不变,接口可以在需要时更改部分。

于 2012-08-05T06:19:42.350 回答