接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。接口不能单独存在;不能进行实例化(因为没有必要实例化);接口不包括任何实现其成员的代码而只定义了成员本身;成员的实现将在实现接口的类中实现。
以上是接口的书本定义,读完基本不知所云。就知道了接口与类不一样,接口与类都需要定义自身的成员,但接口不能实现成员的功能。我觉得可以简单地说:接口是类的更高级抽象(类已经是其所要实现的过程的抽象了),接口定义了类实现的规范。接口好像是事先定义好的备忘录,提醒你,类需要有这些成员,需要完成这些功能。但是,不同的类,他们具体的实现方式则需要你单独去定义了。
举一个简单的例子,我觉得很好很经典。
正如图中所示,我们定义了一个IHuman的接口,以及Student和Teacher两个类。众所周知,学生和老师都是人(虽然他们之间总是或多或少的存在着些许不可调和的矛盾)。因此,学生和老师都有年龄的属性、同样需要吃饭、睡觉...。
但是,几乎可以确定的是,学生和老师是两代人,他们之间有代沟,去完成作为一个人所必须完成的事情的时候,所采用的方式方法是不同的。同时,他们也有不同的行为。比如,一个30岁的副教授,想必已经结婚,所以需要传宗接代、孝敬父母、爱护祖国花朵、教书育人、赚钱糊口...。而学生呢,正值妙龄,血气方刚,不甘寂寞,可想而知...
这样做有什么好处呢?毕竟,没有好处的事情是不会有人去做的。试想,我们没有定义IHuman接口,而是分别定义了Student、Teacher类。有一天,一个想儿子想疯了的家长突然出现在不知所措的学生和老师中间。你需要重新定义一个Parent类,他既不去食堂吃饭也不回家睡觉,一切食宿都在宾馆解决。万一你忘记了Parent也是正常人,没有定义Parent如何去睡觉,是不是要让Parent活活困死呢?当有一天,全国千千万万的新新人类都来到了校园,你会忘记的事情是不是也将会是千千万万,你害死的鲜活生命何以计数呢?
当我们有了IHuman接口,不管怎么说,家长还是人,我们定义一个parent类:
家长此行的其他目的,无非是对学生晓之以钱,对老师动之以礼等等,可以随他折腾了。同时,你还没有忘记需要完美地解决家长的食宿问题。所有的新新人类还是人,完全不用担心你会忘记他们作为人的需求(忘记了?会有编译错误报告告诉你的...)。
上面只是举了一个接口与多个类的例子。实际应用中,我们可以再定义一个ITeacher的接口,Teacher类对应IHuman和ITeacher两个接口,分别规范了老师作为一名人民教师以及一个人的动作。也就是一个类可以同时实现多个接口。
不过好像还是不太明白接口与基类的区别。以下是几个形象的比喻:
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;然而同样会飞的F22和鸽子,一个属于“飞机”类,另一个属于“鸟”类。
2. 铁门跟木门都是门(基类),你想要个门我给不了(基类不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(继承类只能继承于一个基类——单继承);一个门可以有锁(接口)也可以有门铃(另一个接口,多实现)。 门定义了你是什么,接口(锁、门铃)规定了你能做什么,(一个接口最好只能做一件事,你不能要求锁也能发出声音吧)。至于铁门的锁是什么牌子的,木门的门铃是什么声音的,那就是铁门和木门需要关心的事儿了。
总结
以下是我们必须牢记于心的地方,接口只包含方法、委托或事件的签名。方法的实现是在实现接口的类中完成的,接口可以是命名空间或类的成员,并且可以包含下列成员的签名:方法、属性、索引器、事件,一个接口可从一个或多个基接口继承。当基类型列表包含基类和接口时,基类必须是列表中的第一项。实现接口的类可以显式实现该接口的成员。显式实现的成员不能通过类实例访问,而只能通过接口实例访问。
通常认为接口要比基类更加灵活,类只要实现了某一接口,调用者便可以利用该接口实现多态访问,在组件化开发中很常用,由组件规范定义者去定义一个接口,不同分工的发人员按照各自的目的去实现这个接口。而基类的方式相对比较死板,但有一些比较通用的方法就可以不必在子类中重写了。二者不能够说谁的功能更强大,或者说谁能取代谁,只是我们可以根据需要选用。例如.net框架中的TextBox,Label等是从WebControl继承过来,采用基类的方式,而SqlConnection和OracleConnection实现IDbConnection的接口,这样程序就可以使用IDbConnection接口去访问不同类型的数据库。
分享到:
相关推荐
液晶屏LVDS接口详解 LVDS,全称为Low Voltage Differential Signaling,低电压差分信号技术,是现代液晶显示器中广泛使用的一种高速、低功耗、低电磁干扰的数据传输方式。这种接口技术主要应用于主板与液晶屏之间的...
MDIO/SMI通信接口详解 MDIO(Management Data Input/Output)是一种串行管理接口,通常直接被称为 MDIO 接口,主要应用于以太 PHY 的管理。MDIO 接口包含在 IEEE 802.3 协议中,是专用于以太 PHY 的管理的串行总线...
### 各种MII类型接口详解 #### MII(Medium Independent Interface)接口 MII,即介质独立接口,是用于连接以太网MAC(Media Access Control,媒体访问控制)层和PHY(Physical Layer,物理层)的一个标准接口。...
交换机 Hybrid 接口详解 在计算机网络中,交换机的接口类型是非常重要的,它可以改变数据包的处理方式。今天,我们将详细介绍交换机的 Hybrid 接口类型,并解释它与 Access 和 Trunk 接口类型的区别。 交换机的...
路由器接口详解是网络技术中的重要一环,它涉及到路由器如何与其他设备进行物理连接和通信。在本文中,我们将深入探讨路由器的物理接口及其相关知识。 首先,我们需要理解什么是路由器。路由器是网络层设备,它的...
MII 接口详解 MII 接口是 Ethernet 硬件平台中的一种常见接口,英文全称为 Medium Independent Interface,中文翻译为“介质独立接口”。它通常应用于以太网硬件平台的 MAC 层和 PHY 层之间,负责传输数据和控制...
Activiti核心接口详解 Activiti 是一个开源的业务流程管理系统,提供了强大的流程引擎和相关接口。在本节中,我们将详细介绍 Activiti 中的核心接口,包括 ProcessEngineConfiguration、ProcessEngines 等。 1. ...
### HDMI接口与VGA接口和DVI接口详解 #### 一、HDMI接口概述 **HDMI**(High-Definition Multimedia Interface,高清晰多媒体接口)是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。该接口由...
LVDS 接口详解技术文档 LVDS 输出接口是液晶显示器驱动板输出的数字信号中的一种重要组成部分,它可以将 RGB 数据信号、行同步信号、场同步信号和像素时钟信号等传输到液晶面板侧。LVDS 输出接口的出现解决了 TTL ...
LVDS接口详解.doc
jquery_UI_各种接口详解
LVDS 液晶屏幕接口详解 LVDS(Low Voltage Differential Signaling)是一种低压差分信号技术接口,用于解决TTL 接口的缺点,如数据传输速率不高、传输距离较短、抗电磁干扰能力差等问题。LVDS 输出接口可以使数据...
### 电视机各类接口详解 随着平板电视市场的快速发展,电视背后的接口设计越来越受到消费者的重视。现代电视不仅限于传统的电视节目播放,还广泛应用于与数码相机、硬盘、个人电脑、游戏机(如微软Xbox360、索尼PS3...
《电脑硬件所有接口详解》 本文详细介绍了计算机硬件中各种接口的概念、功能、分类以及控制方式,旨在帮助读者深入理解CPU如何与外部设备进行有效通信。 一、I/O接口的概念和分类 I/O接口是CPU与外部设备之间交互...
《电脑电源接口详解》 电脑电源是计算机稳定运行的基础,其中电源接口的设计和规范尤为重要。本文将详细解析电脑主板上的两种主要电源接口:20-PIN ATX 和 24-PIN ATX,并阐述各接口引脚的电压输出及其作用。 首先...
在C#编程语言中,接口是定义一种程序的协定的重要构造,它在面向对象编程中扮演着核心角色。接口定义了类或结构必须遵循的一组规则,但接口本身不提供实现。接口包含方法、属性、事件和索引器,但这些成员没有具体的...
差分时钟接口是电子系统设计中用于同步数据传输和降低干扰的重要技术。该技术利用两个相互依存且反相的信号来表示数据,具有较高抗干扰能力和稳定时钟信号的能力。本文将重点介绍四种常见的差分时钟接口类型:LVPECL...
net core api调用webserver接口详解 Demonet core api调用webserver接口详解 Demonet core api调用webserver接口详解 Demonet core api调用webserver接口详解 Demonet core api调用webserver接口详解 Demo ...