曾今在学习AS3代码的时候,书本上有提过关于接口这样的技术。但实际中接触的不多,原因大概是 底层框架已经是被写好,而自己的话接触的确实较少。而自己的小项目 更是犯不着用这个。一直搁着,也没怎么去弄。一度觉得可有可无的一种技术。直到今天用了之后,才觉得是个不错的东东,便做一记录。好了,闲话少说,正题开始。

接口是什么?

通俗的比喻就是,把一堆相关性不是很强的东西,通过接口来达到一定的归纳。

现实例子就是,U盘与支持U盘的电子设备,以及USB数据线之类的。因为大家都实现一种规定的接口,所以能够在一台电脑上支持所有实现了此接口的U盘。同理 一个U盘也可以在各种不同的实现了此接口的设备上工作。

接口定义关键字  interface

接口实现关键字 implements

下面就以U盘和电脑的关系来练习下

IUSB_3_0接口类


package com._523326.myInterface
{
public interface IUSB_3_0
{
/**
*USB3.0打印方法
*
*/
function print( ):void
}
}

IUSB_2_0接口类


package com._523326.myInterface
{
public interface IUSB_2_0
{
/**
*USB2.0的打印
*
*/
function printf( ):void
}
}

ISellPlat接口类

ISellPlat接口类 用于售价 具有售卖性质的 可以实现此接口
package com._523326.myInterface
{
public interface ISellPlat
{
/**
*喊出广告语
*
*/
function sayADWords( ):void;
}
}

AplleDisk类实现了IUSB3 IUSB2接口 由于其具有售卖的性质 所以同时实现了ISellPlat接口


package com._523326.sample.udisk
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_2_0;
import com._523326.myInterface.IUSB_3_0;

public class AppleDisk implements IUSB_3_0,IUSB_2_0,ISellPlat
{
public function AppleDisk()
{
}
public function print( ):void
{
trace("我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB3.0");
}
public function printf( ):void
{
trace("我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB2.0");
}
public function sayADWords( ):void
{
trace("AppleDisk 售价 ¥200");
}
}
}

TomatoDisk类只实现了IUSB2接口,所以这个U盘是不能插入某台电脑的USB3插口的 因为具有售卖的性质 所以同时实现了ISellPlat接口


package com._523326.sample.udisk
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_2_0;

public class TomatoDisk implements IUSB_2_0,ISellPlat
{
public function TomatoDisk()
{
}
public function printf( ):void
{
trace("我是TomatoDisk 实现了IUSB2.0接口");
}
public function sayADWords( ):void
{
trace("TomatoDisk 售价 ¥100");
}
}
}

RiceDisk类 此U盘实现了USB3接口,可以插进电脑的USB3插口,同时具有售卖性质 所以实现了ISellPlat接口


package com._523326.sample.udisk
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_3_0;

public class RiceDisk implements IUSB_3_0,ISellPlat
{
public function RiceDisk()
{
}
public function print( ):void
{
trace("我是RiceDisk 实现了USB3.0接口");
}
public function sayADWords( ):void
{
trace("RiceDisk 售价 ¥130");
}
}
}

下面是电脑类,没有使用电脑基类。为了方便起见 省去了 基类的继承

DogPc类 这是一台电脑 具有售卖的性质 所以同样实现了ISellPlat接口,同时这台电脑上面支持含有USB3的插口,可以对USB3的U盘进行操作


package com._523326.sample.pc
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_3_0;

public class DogPC implements ISellPlat
{
public function DogPC()
{
}
public function readFromDisk(type:IUSB_3_0):void
{
trace("DogPc从USB3.0接口 读取U盘");
type.print( );
}
public function writeInDisk(type:IUSB_3_0):void
{
trace("DogPc从USB3.0接口 写入U盘");
type.print( );
}
public function sayADWords( ):void
{
trace( "DogPc 售价 ¥2000" );
}
}
}

CatPc类 这台电脑具有售卖的性质 所以同样实现了ISellPlat接口,此电脑只包含一个USB2插口。只能插入USB2的U盘


package com._523326.sample.pc
{
import com._523326.myInterface.ISellPlat;
import com._523326.myInterface.IUSB_2_0;

public class CatPc implements ISellPlat
{
public function CatPc()
{
}
public function readFromDisk(type:IUSB_2_0):void
{
trace("CatPc从USB2.0接口 读取U盘");
type.printf( );
}
public function writeInDisk(type:IUSB_2_0):void
{
trace("CatPc从USB2.0接口 写入U盘");
type.printf( );
}
public function sayADWords( ):void
{
trace( "CatPc 售价 ¥3000" );
}
}
}

主类 假设这是一个电子产品售卖处 有电脑和U盘售卖 所以 包含一个价格提示平台sellItem


package
{
import com._523326.myInterface.ISellPlat;
import com._523326.sample.pc.CatPc;
import com._523326.sample.pc.DogPC;
import com._523326.sample.udisk.AppleDisk;
import com._523326.sample.udisk.RiceDisk;
import com._523326.sample.udisk.TomatoDisk;

import flash.display.Sprite;

public class Interface extends Sprite
{
public function Interface()
{
var catPc:CatPc = new CatPc( );
var dogPc:DogPC = new DogPC( );
var appleDisk:AppleDisk = new AppleDisk( );
var riceDisk:RiceDisk = new RiceDisk( );
var tomatoDisk:TomatoDisk = new TomatoDisk( );

catPc.readFromDisk( appleDisk );//由于AppleDisk同时实现了USB2 和USB3接口 所以其既可以插在CatPc上 又可以插在DogPc上
trace("----------------------------------------------------------");
dogPc.readFromDisk( appleDisk );
trace("----------------------------------------------------------");
catPc.readFromDisk( tomatoDisk );//因为TomatoDisk 只实现了USB2接口,所以只能在CatPc上使用,因为CatPc只有一个USB2插口,与DogPc不会兼容
trace("----------------------------------------------------------");
dogPc.readFromDisk( riceDisk );//因为RiceDisck 只实现了USB3接口,所以只能在DogPc上使用,因为DogPc只有一个USB3接口,与CatPc不会兼容
trace("----------------------------------------------------------");

//这些东西都是可以进行出售的 且都实现了ISellPlat接口,所以 都可以放在柜台上进行售卖
sellItem( catPc );
trace("----------------------------------------------------------");
sellItem( dogPc );
trace("----------------------------------------------------------");
sellItem( appleDisk );
trace("----------------------------------------------------------");
sellItem( riceDisk );
trace("----------------------------------------------------------");
sellItem( tomatoDisk );
}
//卖物品
private function sellItem( type:ISellPlat ):void
{
type.sayADWords( );
}
}
}

运行结果:

CatPc从USB2.0接口 读取U盘
我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB2.0
———————————————————-
DogPc从USB3.0接口 读取U盘
我是AppleDisk 实现了 IUSB2.0 IUSB3.0接口 此方法实现了是IUSB3.0
———————————————————-
CatPc从USB2.0接口 读取U盘
我是TomatoDisk 实现了IUSB2.0接口
———————————————————-
DogPc从USB3.0接口 读取U盘
我是RiceDisk 实现了USB3.0接口
———————————————————-
CatPc 售价 ¥3000
———————————————————-
DogPc 售价 ¥2000
———————————————————-
AppleDisk 售价 ¥200
———————————————————-
RiceDisk 售价 ¥130
———————————————————-
TomatoDisk 售价 ¥100

实现的接口的物品也并非不具有相同性,其肯定是包含有一定的相关性的。正如上面的 电脑和U盘 都是商品可以售卖,如果这样的话,那么和继承有何区别? 其实的话,所有的东西 都有相同点,正如AS3中的所有类的最顶层的基类都是Object。但接口的话,能够避免比较臃肿的继承,而且接口能够实现多个,而继承却只能有一个。

 Demo

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Free Web Hosting