`
isiqi
  • 浏览: 16487845 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

接口的无敌解释

阅读更多
接口
简单的说接口就是一个契约或者规范.比如遥控器,国家出台了一个国家遥控器规范,明文要求所有的遥控器厂家都要遵循这个规范,如果不遵循规范就不给3C认证标志,就不允许上市出卖..为什么要这个规范呢?大家在时间生活中会经常碰到,甲厂的遥控器不能遥控乙厂的电视,电视遥控器不能遥控其它电器如空调,冰箱.!原因是什么呢?是各个遥控器都没有遵循一个规范,电波有长有短,电压有高有低,导致各自为政,4分5列!
可以想像出国家遥控器标准只是是规定遥控器的一些重要技术指标,比如要发射波应该多长,电压应该多高,...,但它绝对不会规范出遥控器的材质,形状,重量和颜色,也是说规范把所有同遥控无关的东西都抛弃了!每个遥控器厂家只要遵循了规范,那么对遥控器可以有任意的诠释.比如A厂可以用铁做,牢固无比,B厂可以用纸,可以任意折叠,anyway,不管用什么做,做出什么样子,只要遵循规范的遥控器就可以遥控所有的电器(当然电器厂家也要遵循一定的规范),甚至可以遥控导弹发射!利害吧,这就是接口的威力.
再详细点,接口就是一个规范,他和具体的实现无关!接口是规范(虚的),他只是一张纸,也是说在实际的使用中接口只有依托一个实现了它的类的实例,才会有意义,如上面的各个厂家做的遥控器产品.每个实现接口的类(厂家)必需实现接口中所有的功能.一旦一个类实现了一个接口,就可说一个类和接口捆绑了(这个很重要,做题目的时候会用到)
来个例子
interface遥控器规范//国家定义的遥控器规范,每个遥控器厂家必需实现(诠释)它
{
int波长();
int电压();
}
class甲厂铁遥控器:遥控器规范//甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了
{
publicint波长();//规范上定义的指标
publicint电压();//规范上定义的指标
publicint形状(){正方形};//甲厂自己对该产品的诠释
publicint材质()(铁};//甲厂自己对该产品的诠释
}
class乙厂纸遥控器:遥控器规范////甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了
{
publicint波长();////规范上定义的指标
publicint电压();//规范上定义的指标
publicint形状()(圆形);//甲厂自己对该产品的诠释,是圆形
publicint材质()(纸);//甲厂自己对该产品的诠释,用纸做,好酷!
}
class电器
{procedure接收遥控(遥控器规范)//电器上,接收遥控指令
{.....
接收(遥控器规范.波长);
接收(遥控器规范.电压);
.....}}
staticmain()
{
甲厂铁遥控器ControlA;//申明控制器对象
乙厂纸遥控器ControlB;
ControlA=new甲厂铁遥控器();//实例化控制器对象,这个时候系统在托管堆中为该对象分配了空间
ControlB=new乙厂纸遥控器();
遥控器规范ControlInterfaceA=(遥控器规范)遥控器1;//把对象实例转换成一个规范,为什么呢?因为"我家的电器".只能识别遥控器规范,它识别不到具体的遥控器
遥控器规范ControlInterfaceB=(遥控器规范)遥控器2;//同上
电器我家的电器=new电器();
我家的电器.接收遥控(ControlInterfaceA)//我用甲厂遥控器遥控我家的电器.注意:这里的ControlInterfaceA是不能单独存在的,它必要依赖实现了"遥控器规范"的类的实例"ControlA".道理很简单,接口是一个指针,不会被分配空间,你就无法使用,只有和一个具体类的实例联系了,才有了可以活跃空间.
我家的电器.接收遥控(ControlInterfaceB)//我用乙厂遥控器遥控我家的电器

...
//下面是我的的想像,我可以用遥控器来控制导弹发射!
我的导弹.接收遥控(ControlInterfaceA);
我的导弹.接收遥控(ControlInterfaceB);
...
}
--------------------------------------------------------------------
接口的执行
好了,有了接口的概念,再来谈c#程序在运行中是如何使用接口的,如何访问接口函数.具体流程如下
a.当调用一个接口的函数时,系统会去检查这个接口对应实例是什么?
b.找到这个实例后,再去找这个实例对应的实例类是什么(什么是实例类,参看读书笔记二)
c.根据这个实例类去检查该实例类是否和接口发生了捆绑(看是否实现了该接口,冒号后面就是)
d.好!如果实例类实现了该接口(发生了捆绑),它就在这个实例类中找函数的定义.然后执行该函数.执行结束.
e.如果没找到,他就继续往父类找,直到找到第一个和接口捆绑的父类为止
f.找到后,它再检查该函数是否是虚拟函数,
g.如果不是,他马上就执行它.
h如果是,麻烦了,系统又要从头来过,去检查该实例类的函数是否重载了该函数,...具体过程见(c#读书笔记2).
例子:

InterfaceI
{
voidFunc();
}

ClassA:I
{
publicvirtualvoidFunc(){Console.WriteLine("FuncA")};
}

classB:A,I//注意这里的意思?
{
publicvoidFunc(){Console.WriteLine("FuncB")};
}

classC:A
{
publicoverridevoidFunc(){Console.WriteLine("FuncC")};
}
staticmain()
{Ia=newA();//申明了接口a,并马上和一个类的实例发生关系了
Ib=newB();//申明了接口b,并马上和一个类的实例发生关系了
Ic=newC();//申明了接口c,并马上和一个类的实例发生关系了
a.Func();//检查a的实例A,发现A和接口I捆绑了,所以执行A的函数Func,结果:FuncA
b.Func();//检查b的实例B,发现B和接口I捆绑了,所以执行B的函数Func,结果:FuncB
c.Func();//家常c的实例C,发现其没有和接口I捆绑,系统继续找它的父类.发现A和I捆绑了,他就去找函数A,发现A是虚拟函数,系统又从头来找类的实例C,发现C重载(override)了Func,好了,马上执行该函数.结果是FuncC;
}
分享到:
评论

相关推荐

    计算机软件-编程源码-messagebox无敌.zip

    在计算机编程领域,源码是程序的原始形式,由程序员用特定编程语言编写,可以直接编译或解释执行。"messagebox无敌"这个标题暗示我们,这可能是一个关于使用MessageBox功能的编程示例或者库,MessageBox通常在...

    shopex店掌柜无敌推广插件(仅供会员客户下载)

    API文档对于开发者来说尤其重要,它详细描述了插件提供的接口,以便于开发者进行二次开发或与其他系统集成。 总的来说,Shopex店掌柜无敌推广插件是一个强大的营销工具,它结合了Shopex的电子商务平台优势,为会员...

    基于ASP的无敌自动链 2.0.zip

    4. **内置对象**:包括Response、Request、Session、Application、Server、ObjectContext等,它们提供了与服务器交互的接口。 5. **服务器端包含**:可以使用指令将其他文件包含到当前ASP页面中。 **ASP的常用内置...

    MINI-PCIE规范完整版

    3. **功能描述**:解释了MINI-PCI-E接口支持的各种功能,如电源管理、热插拔、错误报告等。 4. **兼容性和互操作性**:阐述如何确保MINI-PCI-E设备与主板之间的兼容性和与其他PCI-E设备的互操作性。 5. **测试方法**...

    minocarto:CC魔法无敌

    《minocarto:CC魔法无敌》 在编程领域,minocarto是一款强大的地图渲染库,主要基于TypeScript语言开发,其特色在于为用户提供了一种高效、灵活的方式来创建自定义地图。TypeScript是JavaScript的一个超集,它引入...

    计算机网络(第8版)名词解释

    以下是对一些关键名词的详细解释: 1. ICMP(网际控制报文协议):Internet Control Message Protocol,用于在IP网络中传递错误信息和诊断消息,例如网络不可达、数据包超时等。 2. RIP(路由信息协议):Routing ...

    hfss.matlab.api脚本功能模块.zip_HFSS_HFSS api脚本库_HFSS_MATLAB_API_matla

    2. **基本概念**:解释HFSS API的基本概念,如对象模型、工作空间和数据结构。 3. **API函数介绍**:详细介绍每个脚本模块的功能,如创建几何模型、设置边界条件、启动求解器、读取和分析结果等。 4. **示例代码**...

    教育资料.7z autosar的macal资料

    4. **MCAL接口**:详细解释MCAL子模块的API(Application Programming Interface),包括服务调用、事件触发和数据传输机制。 5. **硬件适配**:讨论如何根据不同的微控制器特性调整MCAL,以确保其能够正确地驱动和...

    WoG简体中文完美版_运行包_基本包.rar

    这个压缩包里的文件都是游戏运行和汉化所必需的组件,下面将详细解释每个文件的作用。 1. Mp3dec.asi: 这是一个ASI插件,用于在游戏中播放MP3格式的音乐。它可能包含了对游戏原声音乐的支持或增强,提供更丰富的...

    EPM240实验板资料

    这份手册会详细解释如何连接ByteBlasterMV到实验板,以及如何使用相关的软件工具进行芯片编程和调试。 EPM240BOTT_PCB.pdf和EPM240TOP_PCB.pdf是实验板的底板和顶板PCB(印刷电路板)设计图纸。这些图纸展示了电路...

    Java九大示例程序.doc

    多态性是指同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在Java中,多态性主要通过方法重载(overloading)和方法覆盖(overriding)来实现。接口回调是多态性的一种应用,通过将接口类型的...

    C#导出数据到EXCEL的方法

    在提供的文档"【原创】C#导出数据到EXCEL方法谈(附实例源码和超级无敌详细讲解).doc"中,你将找到更具体的代码示例和步骤解释,帮助你理解和实现这些方法。通过仔细阅读和实践,你将能够熟练掌握C#导出数据到Excel...

    Head-First-Design-Patterns-master设计模式官方源码

    17. 解释器模式(Interpreter Pattern):解释器模式给定一个语言,定义它的文法表示,并提供一个解释器来解析该文法表示并执行语言定义的行为。 18. 职责链模式(Chain of Responsibility Pattern):职责链模式...

    sdh技术与原理-第一套60道题(标注).docx

    以上知识点详细解释了SDH网络中的保护机制、性能测试、抖动容限、告警处理、接口规范、帧结构等多个方面,这些都是理解SDH技术基础和应用的重要内容。对于“事业编”考试或者相关职业的从业者来说,这些知识的掌握至...

    右侧滚动居中微信悬浮客服代码

    以下是对这个知识点的详细解释: 1. **微信客服接口**:微信提供了官方的客服接口,允许开发者将其集成到网站上,以便用户可以通过微信直接与企业的客服人员进行沟通。这不仅提高了用户的便利性,也增加了企业与...

    Java程序设计——基于JDK 6和NetBeans实现(书本源代码)

    JDK(Java Development Kit)是开发和运行Java程序的必备工具集,包含了JRE(Java Runtime Environment)和一系列的开发工具,如编译器(javac)、解释器(java)和调试器(jdb)等。 2. **JDK 6**:这是Java的一个...

    Java期末考试题及答案.pdf

    - 提供硬件交互的接口 **方法重载(Overloading)**:在同一类中,方法重载是指可以有多个同名方法,但它们的参数列表必须不同(参数数量、类型或顺序不同)。Java编译器根据传入的参数类型来决定调用哪个方法。 ...

    C#操作EXCEL方法谈(附实例源码和详细讲解)

    本压缩包提供的"**C#导出数据到EXCEL方法谈(附实例源码和超级无敌详细讲解)**"文件,应该包含具体的C#代码示例,详细解释了如何实现这些操作。通过阅读和实践这些代码,你可以深入理解C#操作Excel的各种技术,并将...

    GD32的主要资料打包

    中文文档则详细解释了每个库函数的功能、参数及使用示例,帮助开发者高效地编写代码,实现特定功能。 3. **GD32的keilpack**: Keil MDK(Microcontroller Development Kit)是流行的ARM微控制器开发工具,而GD32...

Global site tag (gtag.js) - Google Analytics