分类: Java
2015-03-07 14:41:11
接口回调是指:
如果把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这种程序设计方法称为接口回调。
不同的类在使用同一接口时,可能具有不同的功能体现,即接口的方法体不必相同,因此接口回调可能产生不同的行为。接口回调是多态的另一种体现。
昨晚又研究到三更半夜,组合模式的例子里面有这样一句代码始终不理解为什么这样写:
public function getWeight( ):Number
{
var localWeight:Number =
nWeight;
for (var i:uint = 0; i < this.numChildren; i++)
{
var child:DisplayObject = this.getChildAt(i);
localWeight +=
IPlane(child).getWeight( );
}
return localWeight;
}
localWeight 是个变量,表示飞机的重量,每个组件都定义了这样一个变量,getWeight()返回这个重量的值。一直搞不明白的是为什么IPlane(child)这样写法,很奇怪,这个小问题一直持续到我把这个例子所有代码都看懂,组合模式的方法理解之后还是没搞清楚这个为什么这样写,当然我试过,直接用
localWeight +=child.getWeight(); 这样写报错,尽管child是指向各组件的引用,但是还是报错,刚才突然发现原来是因为 child早就声明为DisplayObject类型了,刚才又测试了一下,如果去掉这个声明,直接用
localWeight +=child.getWeight(); 这句代替发现可以运行,只是有黄色警告提示变量未声明类型,我用的是FLEX,这说明child在定义时,进行了强制类型转换为DisplayObject类型,才导致这样的结果。
所以只能用IPlane(child)这个“接口回调方法”调用对应的对象实例child的getWeight()方法。有人说接口回调是多态的一种体现,没错。我这里的getWight()方法对不同child对象(相关类文件没贴出来了),方法体是不一样的,尽管返回的都是同一性质的属性,但是本质上是不执行了不同的行为。
另外IPlane(child)这个写法其实是很精简的写法。如果没猜错的话,一般情况应该是:
var child:IPlane;
child = new someObject();
child.getWeight();
我看JAVA,C#都是类似的三行写法,没想到还可以这么简写,害的看了好久都没看懂,网上搜索都不知道又弄个什么关键字,搜了半天才知道好像是接口回调,不过幸亏我这种发现问题穷追不舍的精神,才让我理解了接口的妙处和多态的含义,对面向对象的理解又加深了一层。