2010-07-20 78 views
1

接口在设计应用程序时的主要优点以及继承方面的差异。任何机构都可以为我提供简要的例子。关于继承的接口和差异有什么用处

+0

比利,你为什么要将C++标签改为C++/CLI?这里没有任何内容表明Shadow对本地C++不感兴趣。 – 2010-07-20 22:40:18

+0

@Ben:C++没有接口。鉴于这个问题也被标记为C#,他可能在谈论C++/CLI。 – 2010-07-20 22:52:55

+0

'#define interface struct'现在C++有接口。实际上你会在Windows头文件中找到这个确切的宏。我想我们必须等待OP来权衡自己的C++是否对他有意思。 – 2010-07-21 00:20:37

回答

1

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

  • 接口不能有实现
  • 类只能是单继承
+1

.NET类只能单独继承。但C++是这个问题的原始标记,它支持行为/实现和数据/状态以及接口的多重继承。 – 2010-07-20 22:41:25

+0

@Ben:假设我们在谈论C++而不是C++/CLI,这是真的。 – 2010-07-20 22:53:21

1

接口最好的地方使用,其中:

  • 概念级别的多个类共享功能,但实际上并不实际共享代码。
  • 当提供者和用户之间存在硬性分离时,提供者不希望共享该类自身的任何细节。 (这并不一定意味着保密---在WCF,一类的用户&提供商可能由互联网分开;所述用户将需要具有的接口来访问远程对象)
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之间的区别。

0

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

0

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

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

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

插件的具体实现引用了互操作库,因此它的类可以实现实现所需的接口。该应用程序对插件库没有直接的了解,插件库对该应用程序没有直接的了解。通过互通接口只能潜在地沟通

在插件的情况下,是很常见的应用有一个指定的文件夹,插件的位置。在运行时,它扫描组件的文件夹,扫描每个组件,用于类/结构,会检查已知(互操作)接口,每个接口类/结构,并且动态地匹配任何插件它通过接口发现负载。根据机制的不同,每个插件通常会添加到某个菜单的某个位置,以便最终用户可以使用它。

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

此外,为您的应用程序开发插件的第三方只需将重点放在实现来自interop的特定接口上,而不必关心应用程序如何使用它们的具体细节。

0

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

的接口定义任何执行对象必须具有方法签名。它使您的代码可以调用这些对象的方法,而无需了解其他任何信息。

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

Icognito的远程示例实际上比自行车更好。一台电视可能有这样的接口:

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

可能处理该接口一个连接对象将一个或多个电视对象和仿若对象:

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,任何遥控器都可以控制任何电视机。甚至将来的...

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