接口的要点

时间:2010-10-19 18:12:07

标签: design-patterns oop interface class-design

  

可能重复:
  How will I know when to create an interface?

我想知道使用接口的意义。

您使用接口吗?如果是这样,你何时决定使用它们,何时决定不使用它们?

我目前已经为我的服务层和我的存储库层定义了接口,但我想知道我是否错过了其他有用的地方。

我想我只是不完全理解他们的目的。

5 个答案:

答案 0 :(得分:10)

接口定义合同。任何实现接口的类都必须履行该合同。这意味着该类必须实现接口中定义的方法。

一个接口基本上说“我正在定义所有实现者必须做的事情。我不在乎你如何,但你必须支持我指定的这些操作。” / p>

接口的另一个用途是,您可以在方法签名或类型定义中使用它们来指定对象的最通用类型。例如,在Java中Map是一个由HashMapLinkedHashMap等其他类实现的接口。 HashMapLinkedHashMap都基本上属于Map类型。它们实现相同的方法,但它们以不同的方式执行(LinkedHashMap保留插入顺序)。

考虑一下你有一个接受地图的方法的情况。如果没有接口,则需要为每种类型的映射指定方法。实际上,你可以通过重载方法来做到这一点,但这种方法并不是很好。更好的方法是将方法参数的类型指定为Map。然后,任何实现Map的类都可以传递给该方法。这样,您就不必为每种类型的地图指定方法,也不必将使用方法的人限制为地图的特定实现。

接口还保证在实现类时存在指定的功能。因此,它还提供了访问该功能的标准方法。在设计API时,接口也很有用(这样,您可以为要公开的内容指定标准接口)。

接口的另一个好处是它使重构变得容易。假设您想要切换某种对象的实现。该对象可能是方法参数,也可能是类属性。由于您已将该参数或对象键入为接口,因此您只需创建一个实现该接口并传递该类的新类。由于您使用了界面,因此您没有对类的详细信息做出额外的假设。该接口抽象出您正在使用的类的实现细节。这样,您最终不会做出使您的代码与特定实现紧密耦合的假设。

总结一下,接口是关于抽象合同。使用抽象,您可以隐藏底层细节,并仅显示您需要公开的最小值。这样,使用您的类或接口的人不会受到实现细节的负担。所有这些信息都整齐地隐藏在实现接口的特定类中。 合同确保全面标准化;使用该接口的人确保实现该接口的所有类都使用相同的方法。

答案 1 :(得分:6)

接口用于告诉其他人类做某事。

e.g。如果你有SoccerPlayer类实现IInjurable - 从类代码的第一行知道,SoccerPlayer实例知道在受伤时该做什么(你可能知道在之后连字符)。

现在考虑实施IEnumerableIQueryableIDisposable告诉您有关某个对象的内容,并且不知道有关实现本身的任何内容。
好像很多..

答案 2 :(得分:2)

界面就像一个规则列表。您指定了类的要求,对于实现此接口的任何类,您知道它们将遵循这些规则。您可以将这些类强制转换为此接口类型,并在知道它们具有您认为必需的方法,属性和事件的情况下对它们进行操作。

ASP.Net中的一些重要接口是:

  • ICallbackEventHandler
  • IDisposable的

我最近创建了自己的界面,当时我想确保用于特定目的的所有类都有特定的方法和事件。知道了,我可以先检查它是否通过强制转换并验证它来实现接口:

IMyInterface myinterface = myclass as IMyInterface;
if (myinterface == null)
{
    //did NOT implement the interface
}
else
{
    //did implement the interface
    //call the method we KNOW is there.
    myinterface.MyMethod(myparemeter);
}

答案 3 :(得分:2)

许多其他答案遗漏的一点是,接口允许非常有限的多重继承形式,因为两个或更多不相关的类可以实现公共接口,并且代码可以接受实现该接口的对象,而不考虑其他任何关于他们的类型。否则,代码接受多种类型的对象并利用任何通用功能的唯一方法是让它们都从一个本身实现了这种功能的公共基类型下降。

答案 4 :(得分:0)

正如其他人所说,接口定义了一个可以通过类和结构实现的契约。这允许像对象继承这样的接口来启用多态。

然而,界面的实施不同于继承该界面

  1. 结构可能会影响他们。
  2. 接口不能有任何影响。
  3. 可以实现多个界面。这使得一种多重的继承没有相关的问题(对于好的或不好的C#没有实现多重继承)
  4. 因此,一般来说,如果你想要多态性并且想要它用于

    ,接口是好的
    1. 结构
    2. 共享实施没有意义或可能导致脆弱的基础分支
    3. 目标类已存在对象继承
    4. 标准示例是IDisposable,IComparable和IEnumerable,并显示最明显的用途。

      要避免的一些事情是标记接口(没有方法的接口)和不受支持的接口。由系统。例如你有IPost,BasePost,问题,答案和评论,但系统只使用BasePost。