关于设计模式:接口的要点

The point of an Interface

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How will I know when to create an interface?

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

你使用接口吗?如果是这样,你什么时候决定使用它们,什么时候决定不使用它们?

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

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


接口定义了一个契约。实现接口的任何类都必须满足该约定。这意味着类必须实现接口中定义的方法。

接口基本上说"我正在定义所有实现人员必须做的事情。我不管你怎么做,但你必须支持我指定的这些操作"。

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

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

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

接口的另一个好处是它使重构变得容易。假设您希望切换某种对象的实现。对象可以是方法参数,也可以是类属性。因为您已经将该参数或对象作为接口键入,所以您可以简单地创建一个实现该接口的新类并传递该类。因为您使用了接口,所以没有对类的细节做额外的假设。该接口抽象出您正在使用的类的实现细节。这样,您就不会最终做出使代码与特定实现紧密耦合的假设。

总而言之,接口是关于抽象和契约的。通过抽象,您可以隐藏底层细节,只公开需要公开的最低限度的内容。这样,使用您的类或接口的人就不需要负担实现细节了。所有这些信息都被巧妙地隐藏在实现接口的特定类中。契约确保了全面的标准化;使用接口的人确保实现接口的所有类都公开相同的方法。


接口是用来告诉别人一个类做了什么。

例如,如果您有一个实现IInjurableSoccerPlayer类,您从类代码的第一行就知道,SoccerPlayer实例知道受伤时该怎么做(您可能在连字符之后就知道了)。

现在考虑一下实现IEnumerable、iqueryable或IDisposable会告诉您什么关于对象的信息,而这并不了解实现本身。好像很多……


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


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

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

  • iCallbackEventHandler
  • 不可分的

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

1
2
3
4
5
6
7
8
9
10
11
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);
}

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

然而,实现接口不同于继承对象

  • 结构不能实现它们。
  • 接口不能有实现。
  • 可以实现多个接口。它可以实现一种多增强,而不存在关联的问题(无论是好的还是坏的,C都不实现多继承)
  • 因此,一般来说,如果您希望多态性,并且希望它用于

  • 结构体
  • 共享的实现没有意义,或者可能导致脆弱的基础CLA
  • 目标类上已存在对象继承
  • 标准示例有IDisposable、IComparable和IEnumerable,并显示了最明显的用途。

    要避免的一些事情是标记接口(没有方法的接口)和不受支持的接口。通过系统。例如,您有ipost、basepost、question、answer和comment,但系统只使用basepost。