接口(interface),这是C#的基础之一,是实现多态的必要工具。
然而,由于中文中“接口”的多意性,使得我在学习的时候陷入了一个误区,大大困扰了我的学习进度。
因为我在学习这个知识时,第一反应的是下面这种接口:
看网上的视频,老师们首先举的例子也是这种。然而,这种举例是不恰当的。因为,这种接口英文是input/output,也就是所谓的I/O。顾名思义,这种接口的主要作用是传递输入和输出信息。不同的I/O实际上是规定了不同的连接方式和信息传播方式。
那该怎么理解C#中的接口呢?最直接的方法就是看看官方是怎么定义的。打开《C#语言规范》,第1.9节中是这么定义的:
接口 (interface) 定义了一个可由类和结构实现的协定。接口可以包含方法、属性、事件和索引器。
接口不提供它所定义的成员的实现 — 它仅指定实现该接口的类或结构必须提供的成员。
作为一个一个法学毕业的,看到协定,一下子就明白了这到底是怎么回事了。在法律上,协定和协议是同义词。所谓协议,它主要规定的是合同双方或者多方之间的权利义务关系。而合同本身除了文字表述,并不会自己生产出产品或者其它实质的东西。
再回过来看C#中接口的特性:“接口不提供它所定义的成员的实现 ”,这不就和合同只是一份文本一样么,什么具体的事都没干,只是写了一些条条框框。而继承、声明这个接口的类/方法则是这个合同的签订者。集成这个接口,意味着,这个类向大家说,它公开提供这个合同中规定的服务(方法、属性、事件和索引器)。至于怎么实现这些服务的,有这个类自己解决。而在一个类或者方法中声明一个接口,实质上是声明一个继承了这个接口的类,即这是在寻求一些服务,所有能提供这些服务的类都可能成为调用的目标。而调用者只要选出最符合要求的服务提供方来获取服务就好了。具体这个被调用的类内部是怎么实现的,调用者并不需要知道。
以上,就是我对接口的理解。