什么是接口的使用和继承方面的差异

时间:2010-07-20 13:58:32

标签: c# c++ inheritance c++-cli interface

界面在设计应用程序时的主要优点是什么,以及在继承方面的差异。任何机构都可以向我提供简短的例子。

6 个答案:

答案 0 :(得分:4)

对象通过它们公开的方法定义它们与外部世界的交互。方法形成对象与外界的界面;例如,电视机正面的按钮是您与塑料外壳另一侧电线之间的接口。按“电源”按钮打开和关闭电视。 在最常见的形式中,接口是一组具有空体的相关方法。

自行车的行为(如果指定为界面)可能如下所示:

interface IBicycle {

       void changeCadence(int newValue);   // wheel revolutions per minute

       void changeGear(int newValue);

       void speedUp(int increment);

       void applyBrakes(int decrement);
}

要实现此接口,您的类的名称将更改(例如,对于特定品牌的自行车,例如ACMEBicycle),并且您将在类声明中使用implements关键字:

class ACMEBicycle : IBicycle {

   // remainder of this class implemented as before

}

实现接口允许类对其承诺提供的行为变得更加正式。接口在类和外部世界之间形成契约,并且该合同在构建时由编译器强制执行。如果您的类声称实现了一个接口,那么该接口定义的所有方法必须出现在其源代码中才能成功编译该类。

您可以找到更多详细信息,同时检查InterfaceClass之间的差异。

答案 1 :(得分:1)

接口和类之间的唯一区别是:

  • 接口无法实现
  • 课程只能单独继承

答案 2 :(得分:1)

接口最适用于:

的地方
  • 概念级别的多个类共享功能,但实际上并不共享代码。
  • 如果提供者和用户之间存在硬性分离,则提供者不希望分享该类本身的任何细节。 (这并不一定意味着保密 - 在WCF中,类的用户和提供者可能被互联网分开;用户需要具有访问远程对象的接口)

答案 3 :(得分:0)

使用接口的一个优点是您可以在单元测试期间使用模拟的对象 例如。当一个方法需要DbConnection实例时,你必须提供它 - 在一个小测试中这可能非常困难。但是当它需要IDbConnection时,您可以提供模型 SO上有一个标记“mocking”。

答案 4 :(得分:0)

接口广泛用于许多高级设计模式中。特别是如果应用程序设计使用任何类型的依赖注入或控制反转。

例如,插件(附加组件)模型通常使用接口来定义插件。将有一个严格版本化的互操作库(DLL),它定义了应该由应用程序使用的任何插件可以/应该/ 必须实现的接口。

应用程序项目引用了互操作库,它允许它使用任何实现这些接口的类,而不需要直接引用实际的类。

插件的具体实现引用了互操作库,以便其中的类可以实现所需的接口。该应用程序没有直接了解插件库,插件库没有直接的应用程序知识。只能通过互操作接口进行通信。

在插件方案中,应用程序通常会有一个插件所在的指定文件夹。在运行时,它扫描文件夹中的程序集,扫描每个程序集中的类/结构,检查已知(互操作)接口的每个类/结构,并动态加载它找到的任何匹配的插件< em> by interface 。根据机制,每个插件通常都会添加到某个菜单中,以便最终用户可以使用。

在此模型中,无需重新编译应用程序即可更新插件,无需重新编译插件即可更新应用程序。 只要互操作库版本/签名不会更改,就可以独立更新/修改/修复应用程序本身或各个插件,而无需重新分发整个kit-n-kaboodle。 / p>

此外,为您的应用程序开发插件的第三方只需要专注于从您的互操作实现特定的界面,而不必关心您的应用程序如何使用它们的具体细节。

答案 5 :(得分:0)

Icognito有一个很好的答案(我赞成)。我只想添加以下内容:

接口定义了任何实现对象必须具有的方法签名。它使您的代码能够调用这些对象上的方法,而无需了解其他任何内容。

类定义方法签名,可以定义方法主体和属性。类可以实现接口。这使您能够将数据和操作代码保持在一起。

Icognito的远程示例实际上比自行车更好。电视可能有如下界面:

interface ITelevision {
  void TogglePower();
  void ChangeChannel( Int32 channel);
}

可能处理该接口的几个对象可能是一个或多个TV对象和一个Remote对象,如:

class SonyTelevision: ITelevision {
  public void TogglePower {
    //Perform the operation to turn the TV on or off
  }
  public void ChangeChannel (Int32 channel) {
    // Perform the operation of changing the channel
  }
}

class ToshibaTelevision: ITelevision {
  public void TogglePower {
    //Perform the operation to turn the TV on or off
  }
  public void ChangeChannel (Int32 channel) {
    // Perform the operation of changing the channel
  }
}

class Remote {
  private _television : Object; // here we don't care what kind of TV it is.

  public void ToggleTvPower {
    ITelevision tv = _television as ITelevision;
    tv.TogglePower();
  }
}

在上文中,索尼和东芝制造商可能都拥有自己的电视等级层次结构。但是,它们都实现了通用的ITelevision接口,这使得对这些类的编码变得更容易。

另请注意,接口意味着实现由实现类决定。在每天结束时,只要每个人都实施IT电视,任何遥控器都可以控制任何电视。即使是未来......

最后一点:抽象类与接口类似,抽象类需要后代来提供方法体。但是,因为类只能从单个父类继承而类可以实现任意数量的接口。