来源:http://blog.sina.com.cn/s/blog_4d65c19e0100bfkb.html

抽象类:又叫抽象基类:可以包含一般类所包含的所有特性,例如,字段,属性,方法,抽象类不能被实例化他主要用在类的定义和部分实现这方面,所以他需要在扩充类中完整的扩充并实现功能.另外抽象类还包含一个很特殊的方法,叫抽象方法(这些方法基本上是没有执行代码的函数,由继承于该类的类重写(override)并提供具体实现).在Java和C#中,有abstract关键字来定义抽象类,而在As3中,并没有提供抽象类的支持,尽管abstract已经属于关键字,我们只可以通过模拟方法来实现抽象类的机制。在AS3笔记(11),适配器模式(Adapter Pattern)的范例中,Adaptee.as就是一个抽象类,而如requestB()则是一个抽象方法.

package {
    public class Adaptee {
        public function requestA():void {
            trace("Adaptee:requestA()");
        }
        public function requestB() {

}
        public function requestC():void {
            trace("Adaptee:requestC()");
        }
    }
}

接口:接口是一种特殊的抽象类,用interface 关键字标记,他可以包含实例/静态方法和getter/setter方法,任何实现该接口的类就必须按照接口的定义实现这些方法.As3中的类可以实现(implements)多个接口.相对于类,接口更象是一种方法的协议,使用接口可以更好的管理模块的功能,方便整理和引用。在AS3笔记(11),适配器模式(Adapter Pattern)的范例中,ITarget.as则是一个典型的接口.

package {
    public interface ITarget {
        function renamedRequestA():void;
        function requestA():void;
        function requestB():void;
        function requestC():void;
        function requestD():void;
    }
}

帮助中提到,接口是定义一个方法组的数据类型,其中的方法必须由实现接口的任何类定义。

接口与类相似,但也有以下重要差异:

  • 接口仅包含方法的声明,而不包含其实现。也就是说,实现接口的每个类必须为该接口中声明的每个方法提供实现。
  • 接口方法定义无法具有任何属性,例如 public 或 private,但是在实现接口的类的定义中,实现的方法必须标记为 public
  • 多个接口可以通过 extends 语句由接口继承,或通过 implements 语句由类继承。

从编程的角度来看,抽象类和接口都可以用来实现"design by contract"的思想。
在具体的使用上,抽象类表示的是一种继承关系,在AS3中,只支持单继承不支持多继承。但是,一个类却可以实现多个接口。这和Java一样。

其次,在抽象类的定义中,我们可以赋予方法的默认方法。但是在接口的定义中,方法却不能拥有默认行为。不能定义默认方法,对于后期代码的维护相对比较麻烦,比如需要给所有实现接口的类修改默认方法,可能需要修改每一个类,而如果是继承,则只需要修改抽象类即可。虽然我们可以通过委托来绕过定义默认行为,但是仍然有一点麻烦。

从程序设计的角度来看,接口很大程度上可以弥补无法使用多继承而带来的问题。见下图
图1

图1为一个典型的继承案例.例子中为生成一个bus driver实例类和一个taxi driver实例类.

图2


由于没有多继承,我们要生成一个男公车司机和女出租车司机看起来都不那么靠谱.那怎么办呢?一般除了让其中的一类做为功能复合到最后的实例类中,更标准的就是使用接口了.见下图:
图3

图3表示继承自man和woman的实例类bus driver和taxi driver实现了通过employment接口标准的dirver类功能。综合来说,抽象类的应用一般为树性结构,而加入接口的应用可以使结构更丰富可靠。
总结一下抽象类和接口在语法和设计原则上的区别   
    
  1.抽象类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类。
    接口只是一个行为的规范或规定,抽象类更多是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类种。
  2.一个类一次可以实现若干个接口,但是只能扩展一个父类。
  3.默认情况下,ActionScript 3.0 中的所有类都是密封的,所以抽象类也能被密封。
  4.接口与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。
  5.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的作为子类去实现。
  6.  好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。   
  7.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到内存中,非常耗资源。   
  8.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中的方法。

应用场景:
如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
如果创建的功能将在大范围的全异象间使用,则使用接口。
如果要设计小而简练的功能块,则使用接口。
如果要设计大的功能单元,则使用抽象类。
要在组件的所有实现间提供通用的已实现功能,则使用抽象类。

关于As3的抽象类与接口,还可以看一下几篇文章:
http://www.asv5.cn/blog/article.asp?id=164
http://riaidea.com/article.asp?id=26
http://space.actionscript3.cn/html/73/t-973.html

As3.0 Interface 与类的使用的更多相关文章

  1. as3.0 interface接口使用方法

    [转]as3.0 interface接口使用方法 AS在2.0的时候就支持接口了 接口能够让你的程序更具扩展性和灵活性,打个例如 比方你定义了一个方法 代码: public function aMet ...

  2. AS3.0的动态类和密封类

    动态类:生成的实例可以在运行时动态添加属性和方法.类名前有dynamic就是动态类 密封类:生成的实例不可以在运行时动态添加属性和方法

  3. As3.0 类的【枚举】

    As3.0 类的枚举   “枚举”是您创建的一些自定义数据类型,用于封装一小组值.ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 En ...

  4. AS3.0 自定义右键菜单类

    AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...

  5. 再理解 as3.0接口

    As3.0 接口的理解与运用 1.把接口当作"类"来理解.你easy接受她. 我们看她的标准结构: package 包路径{ public interface 接口名称{ func ...

  6. [转]Flash、Flex、AS3.0框架及类库资源收集之十全大补

    原文地址:http://www.d5power.com/portal.php?mod=view&aid=27 APIs.Libs.Components1.as3ebaylibhttp://co ...

  7. Java&&As3.0 中的final 关键字

    Java和AS3.0关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.   可以修饰的对象:   fin ...

  8. “AS3.0高级动画编程”学习:第一章高级碰撞检测

    AdvancED ActionScript 3.0 Animation 是Keith Peters大师继"Make Things Move"之后的又一力作,网上已经有中文翻译版本了 ...

  9. “AS3.0高级动画编程”学习:第二章转向行为(下)

    在上一篇里,我们学习了“自主角色”的一些基本行为:寻找(seek).避开(flee).到达(arrive).追捕(pursue).躲避(evade).漫游(wander).这一篇将继续学习其它更复杂, ...

随机推荐

  1. log4j.properties 的使用详解

    一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...

  2. selenium grid的使用与配置

    一.selenium grid的组成与作用:由一个集线器hub和多个客户机node组成,如果你的程序需要在不用的浏览器,不同的操作系统上测试,而且比较多的case需要多线程远程执行,那么一个比较好的测 ...

  3. ArcGIS导出辖区边界点坐标

    1.使用ArcGIS打开.mxd地图文件 2.选择[Geoprocessing][ArcToolbox]  3.展开菜单,选中如图所示菜单,双击打开 4.选择对应的辖区节点   5.点击OK后,会在左 ...

  4. Ubuntu 安装Composer

    操作系统:Ubuntu 14.04.2 1.自动安装 $ curl -sS https://getcomposer.org/installer | php 2.更新 $ composer self-u ...

  5. weex 语法高亮

    @1.ctrl+shift+p,调出控制命令面板,@2.输入pic,点击进入 @3.输入vue Syntax Highlight,等待下载 所有的sublime下载插件同理. vue Syntax H ...

  6. Atitit 版本管理----分支管理

    Atitit 版本管理----分支管理 版本管理系统"(Version Control System Branch/tag在一个功能选项中,在使用中很容易产生混淆. 分支(Branch)管理 ...

  7. Jmeter 多台机器产生负载

    使用多台机器产生负载的操作步骤如下: (1)在所有期望运行jmeter作为 负载生成器的机器上安装jmeter, 并确定其中一台机器作为 controller ,其他的的机器作为agent .然后运行 ...

  8. WCF初接触实作

    我们通过实现一个简单的示例来对WCF有个直观而浅显的认识,希望对初次涉及WCF的朋友有所帮助. 可以简单地认为WCF程序分为4部分:契约.服务.宿主.客户端.我们通过一个例子来逐步完成各部分,示例程序 ...

  9. 《JS权威指南学习总结--6.3删除属性》

    内容要点: 一.delete运算符可以删除对象的属性.它的操作数应当是一个属性访问表达式.让人感到意外的是,delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性: delete book ...

  10. Eclipse Kepler maven工程配置JDK1.8

    首先需要下载插件:"Help" --> "Market Place" --> Search for java 8 kepler. install J ...