接口的无敌解释!

原创 2005年05月02日 21:13:00

       接口

       简单的说接口就是一个契约或者规范.比如遥控器,国家出台了一个国家遥控器规范,明文要求所有的遥控器厂家都要遵循这个规范,如果不遵循规范就不给3C认证标志,就不允许上市出卖..为什么要这个规范呢?大家在时间生活中会经常碰到,甲厂的遥控器不能遥控乙厂的电视,电视遥控器不能遥控其它电器如空调,冰箱.!原因是什么呢?是各个遥控器都没有遵循一个规范,电波有长有短,电压有高有低,导致各自为政,4分5列!
       可以想像出国家遥控器标准只是是规定遥控器的一些重要技术指标,比如要发射波应该多长,电压应该多高,...,但它绝对不会规范出遥控器的材质,形状,重量和颜色,也是说规范把所有同遥控无关的东西都抛弃了!每个遥控器厂家只要遵循了规范,那么对遥控器可以有任意的诠释.比如A厂可以用铁做,牢固无比,B厂可以用纸,可以任意折叠,anyway,不管用什么做,做出什么样子,只要遵循规范的遥控器就可以遥控所有的电器(当然电器厂家也要遵循一定的规范),甚至可以遥控导弹发射!利害吧,这就是接口的威力.
      再详细点,接口就是一个规范,他和具体的实现无关!接口是规范(虚的),他只是一张纸,也是说在实际的使用中接口只有依托一个实现了它的类的实例,才会有意义,如上面的各个厂家做的遥控器产品.每个实现接口的类(厂家)必需实现接口中所有的功能. 一旦一个类实现了一个接口,就可说一个类和接口捆绑了(这个很重要,做题目的时候会用到)
来个例子
interface 遥控器规范 //国家定义的遥控器规范 ,每个遥控器厂家必需实现(诠释)它
{
int 波长();
int 电压();
}
class 甲厂铁遥控器 : 遥控器规范 //甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了
{
public int 波长(); //规范上定义的指标
public int 电压(); //规范上定义的指标
public int 形状() { 正方形}; //甲厂自己对该产品的诠释
public int 材质() ( 铁 }; //甲厂自己对该产品的诠释
}
class 乙厂纸遥控器 : 遥控器规范 ////甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了
{
public int 波长(); ////规范上定义的指标
public int 电压(); //规范上定义的指标
public int 形状()( 圆形); //甲厂自己对该产品的诠释,是圆形
public int 材质()( 纸); //甲厂自己对该产品的诠释,用纸做,好酷!
}
class 电器
{procedure 接收遥控(遥控器规范 ) //电器上,接收遥控指令
{.....
接收(遥控器规范.波长) ;
接收(遥控器规范.电压);
.....} }
static main()
{
甲厂铁遥控器 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).
例子:
Interface I
{
void Func() ;
}

Class A : I
{
public virtual void Func() { Console.WriteLine("FuncA")};
}

class B : A , I //注意这里的意思?
{
public void Func() { Console.WriteLine("FuncB")};
}

class C : A
{
public override void Func() { Console.WriteLine("FuncC")};
}
static main()
{ I a = new A() ; //申明了接口a,并马上和一个类的实例发生关系了
I b = new B() ; //申明了接口b,并马上和一个类的实例发生关系了
I c = new C() ; //申明了接口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;
}

虚函数无敌解释

助于理解。。。 虚拟函数(virtual)   使用面向对象的开发过程就是在不断的抽象事物的过程,我们的目标就是抽象出一个紧内聚,低偶合,易于维护和扩展的模型.但是在抽象过程中我们会发现很多事物的...

无敌全网AI和机器学习资源大合集

2000年早期,Robbie Allen在写一本关于网络和编程书的时候,深有感触。他发现,互联网很不错,但是资源并不完善。那时候,博客已经开始流行起来。但是,YouTube还不是很普遍,Quora、 ...

卡匠M1卡中华无敌锁匠专供版(全加密IC卡的终结者)

 任何一个新生事物的诞生都与巨大的商机挂钩。 任何一个新生事物的诞生,又都在一片反对怀疑拒绝中悄然来临。 21世纪的新生事物一定和趋势有关,而趋势不是用眼睛看的,是要用眼光来判断的。谁抓住趋...

无敌是多么多么寂寞【操作系统FIFO及LRU算法C语言实现】

诶亚麻好久没有更博了TnT太忙了最近真的,从开学到现在一个周末都没有,没有什么比改好bug更让人兴奋的事情了哈哈哈哈。趁着刚实现完算法的这一会,总结一下OS页面置换两个算法:先进先出及最久未使用我的教...
  • Joki233
  • Joki233
  • 2017年11月13日 22:15
  • 35

忍者无敌-实例讲解Cocos2d-x瓦片地图

实例比较简单,如图所示,地图上有一个忍者精灵,玩家点击他周围的上、下、左、右,他能够向这个方向行走。当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包括了:树、山、河流等。忍者实例地图(TOD...

android版微信打飞机无敌补丁分析及其制作方法

本文出自:http://www.creturn.com/android版微信打飞机无敌补丁分析及其制作方法/ 原创作品,转载请注明来源及其作者信息,负责后果自负! 最近微信5.0版本发布后增加了游...

2016.8.7+8.8+8.9+8.10+8.12 炒鸡无敌程序大集合

总结一下,这几天的学习情况大概是这样的。 8.7:后缀数组 8.8:字典树 8.9:最大流 8.10:考试(无内容) 8.12:组合数学+拓扑图+强连通分量后缀数组  后缀数组的主要内容就是...
  • Riven__
  • Riven__
  • 2016年08月12日 19:42
  • 1192

忍者无敌-实例讲解Cocos2d-x瓦片地图

实例比较简单,如图所示,地图上有一个忍者精灵,玩家点击他周围的上、下、左、右,他能够向这个方向行走。当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包括了:树、山、河流等。忍者实例地图(TOD...

【转】爱国的猪心血分享--史上无敌的正品好店收藏夹!

爱国的猪心血分享—史上无敌的正品好店收藏夹! 爱国的猪所在的青岛是山东半岛纺织业最集中的区域,黄岛区、胶州、莱西等外贸工厂特别多(一些多年的OEM代工厂也逐渐发展到有了自有品牌)。其中不乏TNF...

微信 天天爱消除 Lua无敌脚本

lua脚本?不要一看到这种名词就吓倒,照着下面的流程做,一切都会很简单。 先把程序下载到你的电脑先吧。 点击下载:Lua脚本iphone,ipad 点击下载:触动精灵deb.rar ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接口的无敌解释!
举报原因:
原因补充:

(最多只允许输入30个字)