在Actionscript-3和其他语言中存在接口的原因是什么

时间:2013-03-26 19:39:25

标签: actionscript-3 flash interface

这个接口是什么意思?即使我们在类上实现了一个接口,我们每次在不同的类上实现它时都要反复声明它的功能,所以as3或任何其他具有接口的语言都存在接口的原因是什么。 谢谢

5 个答案:

答案 0 :(得分:3)

我基本同意到目前为止发布的答案,只是有点补充。

首先回答简单的部分,是的其他语言有接口。立即想到Java,但我很确定所有OOP语言(C ++,C#等)都包含一些创建接口的机制。

如Jake所述,您可以将接口编写为“合同”,以便分离工作。假设我正在研究A并且你正在研究C,并且bob正在研究B.如果我们将B'定义为B的接口,我们可以快速且相对容易地定义B'(相对于定义B,实施),一切都在继续。我可以假设从A我可以编码到B',您可以假设从C开始编码到B',当bob完成B时我们可以插入它。

这是Jugg1es的观点。通过“依赖注入”可以更换掉整个功能块的能力(如果你不知道这个短语,请google它)。这就是所描述的确切内容,您创建了一个接口,通常定义了某些内容,例如数据库连接器。对于所有数据库连接器,您希望它能够连接到数据库并运行查询,因此您可以定义一个接口,该接口说明类必须具有“connect()”方法和“doQuery(stringQuery)”。现在让我们说Bob编写了MySQL数据库的实现,现在你的客户端说我们刚刚为新服务器支付了200,000,他们将运行Microsoft SQL,以便利用你的软件利用你需要做的就是换掉数据库连接器。

在现实生活中,我有一位朋友在芝加哥经营肉类包装/分销公司。制造软件/硬件设置以进行扫描包装和称重物品进入和退出(库存)的公司告诉他们,他们必须升级到更新的操作系统/服务器和更新的硬件才能与软件保持一致。该软件不是以模块化方式编写的,允许它们保持向后兼容性。我曾多次在这艘船上,告诉某人xyz需要升级才能获得abc功能,这将使我的工作变得更容易90%。无论如何猜测在现实世界中,人们并不总是利用这些东西,它可以咬你的屁股。

答案 1 :(得分:2)

接口对OOP至关重要,特别是在开发大型应用程序时。例如,如果您需要一个数据层来返回数据,例如,用户。如果你最终改变了数据的获取方式怎么办,比如你开始使用XML Web服务数据,然后切换到平面文件或其他东西。如果为数据层创建了一个接口,则可以创建另一个实现它的类,并对数据层进行所有更改,而无需更改应用程序层中的代码。我不知道你是使用Flex还是Flash,但是在使用Flex时,接口非常有用。

答案 2 :(得分:2)

接口是一种定义类功能的方法。当你独自工作(特别是刚开始)时,它可能没有多大意义,但当你开始在团队中工作时,它可以帮助人们理解你的代码如何工作以及如何使用你编写的类(同时保持代码封装) )。在我看来,这是在中级水平考虑它们的最佳方式。

答案 3 :(得分:2)

虽然现有答案非常好,但我认为他们错过了在ActionScript中使用Interfaces的主要优势,即您可以避免将该接口的实现编译到主文档类中。

例如,如果您有一个ISpaceShip接口,您现在可以选择执行几项操作来填充键入该接口的变量。您可以加载主Document类实现ISpaceShip的外部swf。一旦Loader的contentLoaderInfo的COMPLETE事件触发,你将content转换为ISpaceShip,并且它的实现(无论它是什么)永远不会被编译到你的加载swf中。这允许您在加载过程发生时将真实内容放在用户面前。

出于同样的原因,你可以在ISpaceShip类型的父AS类中声明一个时间轴实例,其中“在框架N *中检查导出动作脚本* *。这将在首次使用它的帧上编译,所以你在你的预加载时间内不再需要考虑到这一点。用足够的东西做这件事突然你甚至不需要一个预加载器。

编码接口的另一个优点是,如果您正在对代码进行单元测试,除非您的代码完全无关紧要。这使您可以确保代码在其自身优点上成功或失败,而不是基于协作者的优点,或者协作者不适合测试。例如,如果您有一个旨在控制特定类型View的控制器,那么您不会想要实例化测试的完整视图,而只想实现对测试产生影响的功能。

如果您在编写测试的工作情况中没有支持,那么编写接口有助于确保一旦达到可以编写测试的程度,您的代码就可以测试。

答案 4 :(得分:1)

上面的答案都非常好,我唯一要添加的东西 - 它可能不会立即用AS3这样的语言清楚地表达,其中有几个无类型的集合类(数组,对象和字典)和对象/动态类 - 它是一种按类型对其他不同对象进行分组的方法。

一个简单的例子:

你有一个太空射击者的图像,玩家拥有锁定各种目标的导弹。假设为此目的,你想要任何类型的对象可以被锁定以具有用于注册它的内部函数(也称为接口):

function lockOn():void;//Tells the object something's locked onto it

function getLockData():Object;//Returns information, position, heat, whatever etc

这些目标可以是任何东西,一系列完全不相关的类 - 敌人,朋友,通电,健康。

一种解决方案是让它们全部从包含这些方法的基类继承 - 但是敌人和健康拾取器在逻辑上不会共享一个共同的祖先(如果你发现自己制造了奇怪的继承链以满足你的需求那么你应该重新考虑你的设计!),你的导弹还需要引用它锁定的物体:

var myTarget:Enemy;//This isn't going to work for the Powerup class!

var myTarget:Powerup;//This isn't going to work for the Enemy class!

...但是如果所有可锁定类都实现了ILockable接口,则可以将其设置为类型引用:

var myTarget:ILockable;//This can be set as Enemy, Powerup, any class which implements ILockable!

..并将上述功能作为界面本身。




它们在使用Vector类时也很方便(名称可能误导你,它只是一个类型化的数组) - 它们比数组运行得快得多,但只允许单一类型的元素 - 同样,接口可以指定为类型:

var lockTargets:Vector.<Enemy> = new Vector.<Enemy>();//New array of lockable objects

lockTargets[0] = new HealthPickup();//Compiler won't like this!

但是......

var lockTargets:Vector.<ILockable> = new Vector.<ILockable>();

lockTargets[0] = new HealthPickup();
lockTargets[1] = new Enemy();

如果EnemyHealthPickup实施ILockable,那么工作得很好!