代码改变世界

谈谈我对接口的理解

2011-04-29 12:59  RyanXiang  阅读(4345)  评论(21编辑  收藏  举报

 

写在前面:


本随笔,之所以叫随笔而不叫文章。就是说本文只是个人对技术的粗浅理解,不当、抑或错误之处在所难免。如遇高人指点一二,自当不胜感激。

从概念上看接口


1、MSDN上有如下定义:

接口描述的是可属于任何结构的一组相关功能。

 

那么何为一组相关功能,其实就是一种共同的行为。那么为什么要把这种共同的行为,抽象到一个接口中呢?

这就要从下面说起了:

1、规范和约束

       中国有句古话叫做“没有规矩不成方圆”,经过千年的传承,证明这句话还是很有道理的。车同轨,书同文,行同伦。经济才能发展,社会才会进步,这就充分说明了规范和约束存在的重要性。现实生活中的例子也比比皆是,比如家里的电源插座就只有两种接口,试想一下,如果不同的电器产品都有自己的电源插座的标准,而不遵守这种约束,那将会成什么样子?在比如我们常用数码产品的数据线,我总是在想要是所有的都能用一条该多好啊!废话说了一堆,我无非是想说规范和约束,在特定的情况下是有好处的这也就是为什么要把这种共同的行为,抽象到一个接口的原因之一。

2、多态的实现

关于多态,大家可以参看MSDN,至于能不能理解,能理解到什么程度,全在个人修行,通过接口可以实现这种多态的行为。

 

从C#语言看接口


关于接口如何使用,语法层面上的东西我不想多说,园子里已经有很多文章,大家可以参考。在这里我想通过显式接口以及访问修饰符的层面上来谈谈我对接口的理解。

大家都知道接口中定义的成员是没有访问修饰符的。例如:如果你要在 void doWork()前面加上访问修饰符,编译将不会通过。

   1: interface IControl
   2: {
   3:      void doWork();
   4: }

但是为什么要这么设计呢?这时候有人就说了,你这不是废话么!接口就没有必要用访问修饰符,接口就是让人来实现的,接口中的成员如果设置成除了public以外的修饰符,就没有意义了。所以在设计C#的时候,微软就把接口设计成不需要使用访问修饰符。但底层却全部是使用的public,这一点我们可以冲IL代码中看出,如下图:

飞信截屏未命名

所以在某个类实现该接口的时候,doWork()方法也必须是public的,如果不是同样编译不过。

   1: class Worker : IControl
   2: {
   3:     public void doWork()
   4:     {
   5:         Console.WriteLine("do work now!!");
   6:     }
   7: }

现在我们在来看看显式接口

显式接口是微软为解决多个接口有相同的签名,并且被同一个类实现的时候,所造成的问题。来看看MSDN上的例子,(截取部分代码)你会发现显示接口在实现接口成员时,没有访问的修饰符。同样的道理,因为显式接口必须通过接口来调用,所以才这么设计,不过通过IL代码,我们可以看到void IControl.Paint() 前面的修饰符是private如下图。从接口的访问修饰符的设计上来看,我们就在一定的程度上看出约束的影子。

   1: public class SampleClass : IControl, ISurface
   2: {
   3:     void IControl.Paint()
   4:     {
   5:         System.Console.WriteLine("IControl.Paint");
   6:     }
   7:     void ISurface.Paint()
   8:     {
   9:         System.Console.WriteLine("ISurface.Paint");
  10:     }
  11: }
  12:  

飞信截屏未命名

 

 

当然写到这里还不算完,下篇我将整理思路从设计的角度,来谈谈接口。