接口的用途和继承方面的区别是啥

Posted

技术标签:

【中文标题】接口的用途和继承方面的区别是啥【英文标题】:what are the use of interfaces and diffrences with respect to inheritance接口的用途和继承方面的区别是什么 【发布时间】:2010-07-20 13:58:32 【问题描述】:

接口在设计应用程序中的主要优点是什么以及在继承方面的区别。任何人都可以为我提供一个简短的例子。

【问题讨论】:

Billy,你为什么把 C++ 标签改成 C++/CLI?这里没有任何迹象表明 Shadow 对原生 C++ 不感兴趣。 @Ben:C++ 没有接口。鉴于这个问题也被标记为 C#,他可能在谈论 C++/CLI。 #define interface struct 现在 C++ 有了接口。事实上,您会在 Windows 标头中找到确切的宏。我想我们必须等待 OP 权衡原生 C++ 是否对他感兴趣。 @Billy 和@Ben,我也问过这个关于 C++ 的问题。在很多设计中,我看到 C++ 使用接口。。 @Shadow:C++ 没有接口,因此会造成混乱。 【参考方案1】:

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

如果指定为接口,自行车的行为可能如下所示:

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 之间的区别的更多详细信息。

【讨论】:

【参考方案2】:

接口和类的唯一区别是:

接口不能有实现 类只能单独继承

【讨论】:

.NET 类只能单独继承。但是问题上的原始标签 C++ 支持行为/实现和数据/状态以及接口的多重继承。 @Ben:这是真的,假设我们说的是 C++,而不是 C++/CLI。【参考方案3】:

接口最好用在以下地方:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

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

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

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

此外,将为您的应用开发插件的第 3 方只需专注于从您的互操作中实现特定接口,而不必关心您的应用如何使用它们的具体细节。

【讨论】:

【参考方案6】:

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 接口,这使得针对这些类的编码变得更加容易。

还要注意,接口意味着实现留给实现类。归根结底,只要每个人都实施 ITelevision,任何遥控器都可以控制任何电视。甚至未来的……

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

【讨论】:

以上是关于接口的用途和继承方面的区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

受保护继承的实际用途是啥?

java 实现接口和继承有啥区别

struts和struts2的区别是啥?

Java中面向对象的三大特征是啥?

Thread使用总结——Runnable和Thread的区别是啥

android studio implement和extend是啥区别