`

AS3中super的用法[转自A闪]

    博客分类:
  • AS3
 
阅读更多

super它到底是什么?这是我第一个问题,在帮助中石这样说明的“调用方法或构造函数的超类或父版本。在类构造函数体内使用 super() 语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。然而,根据 ActionScript 2.0 的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。”说了半天也是含糊其辞,我个人的理解就是super实际上是一个超类或父类的引用。我们可以把super看做是父类的一个实例。这样就好理解多了。但实际上它并非是父类的一个实例,我这样说只是方便理解。那么我们可以怎么去使用它呢?在帮助文档中提到了两种使用方法:

super([arg1, ..., argN])
super.method([arg1, ..., argN])

先来说说第二种,因为第二种比较好理解。我写了一个例子,大家来看一下就明白了!
package 
{
/**
* ...
* @author A闪
*/
public class Flei
{

public function Flei()
{

}
public function shu():void
{
trace("a");
}

}

}

package 
{
/**
* ...
* @author A闪
*/
public class Zlei extends Flei
{

public function Zlei()
{

}
public override function shu():void
{
super.shu();
trace("b");
}

}

}

package
{
import flash.display.Sprite;
import flash.events.Event;

/**
* ...
* @author A闪
*/
public class Main extends Sprite
{

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var a:Zlei = new Zlei();
a.shu();
}

}

}
运行这个程序,我们会看到输出ab。但是为什么会输出这个结果呢?实际上就是因为我们使用了super语句。再上面这个范例中,我们重写了了shu方法。如果重写的话,父类中的所有语句就等于被删除了!但是假如我们只希望在原来的功能上添加一些功能,怎么办呢?使用super,这样再调用一次父类的shu方法,原来的语句就被执行一次,相当于将原来的语句保留了。在此基础之上我们在添加一个新的语句。本例中就是trace("b");这个super的一种使用方法。
我们再来看另外一种使用方法。super()这个语句可以看做是父类的构造函数。什么意思呢?我们来简单的解释一下,一个父类,如果其构造函数不需要参数,那么好了!我们可以像上面那个例子中一样去使用。但是大家注意,在程序运行的时候,子类实际上是先执行一次父类的构造函数的。这个过程中,程序会自动的在子类的构造器函数中添加一个调用的语句。我们可以把它称为隐式调用。好了!现在我们将程序稍微修改一下,在Flei类文件的构造器函数中添加一个参数,代码如下:
package 
{
/**
* ...
* @author A闪
*/
public class Flei
{

public function Flei(wen:String)
{

}
public function shu():void
{
trace("a");
}

}

}
我们可以看到,父类现在在初始化的时候需要一个参数,但是在子类中使用的是隐式调用,那么程序不会像父类的构造函数中传递任何参数,此时运行程序就会报错。怎么办呢?使用super(),这个语句就是调用一次父类的构造函数,写上这个语句和不写这个语句是一样的,写上了就是显示调用。那么写上之后有什么好处呢?好处就是我们可以为父类的构造函数添加参数了~!这样就可以解决上面的错误。
看一下实例!!我们只更改子类文件:
package 
{
/**
* ...
* @author A闪
*/
public class Zlei extends Flei
{

public function Zlei()
{
super("A闪");
}
public override function shu():void
{
super.shu();
trace("b");
}

}

}
这样修改之后,大家再来运行一下影片,呵呵@!不报错了吧!super的使用就这两个,明白了就非常简单,不明白,就费劲了!不知道说的明不明白。大家有不明白的地方给我留言,我会一一解答的!~
最后总结一下,当父类的构造函数中需要参数,则在子类中构造函数中可能会出现super(参数...),这时候我们叫做显示调用。当父类的构造函数中没有参数的时候,可以不写super(),这个时候叫做隐式调用。另外,子类初始化的时候一定会先调用父类的构造函数(必须的)。
第二种用法就是把super当做一个变量,当做父类的应用,通过super.方法()或者super.属性,可以访问父类中的方法和属性。

分享到:
评论

相关推荐

    深入浅析ES6 Class 中的 super 关键字

    super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。 1、当作函数使用 class A {} class B extends A { constructor() { super(); //ES6 要求,子类的构造函数必须...

    AS3.0 TLFTextField 组件库

    AS3.0 TLFTextField 最新的组件库 以往的有BUG,这个可是最新的哦 package { import fl.controls.UIScrollBar; import fl.text.TLFTextField; import flash.events.Event; import flashx.textLayout....

    Android中Glide获取图片Path、Bitmap用法详解

    软件开发网在此之前给大家介绍过图片加载框架Glide的基本用法介绍,大家可以先参考一下,本篇内容更加深入的分析了Glide获取图片Path、Bitmap用法,以及实现的代码分析。 1. 获取Bitmap: 1)在图片下载缓存好之后...

    Think in ActionScript 3.0Ⅰ Ⅱ Ⅲ汇总

    4.5.1 TestSuper.as —— this 和 super 以及 override 4.5.2 this 和 super 的内存分析 4.5.3 TestThis.as —— 用 this 区分局部变量与成员变量 4.6 初始化顺序 4.7 静态属性与方法 4.7.1 static的概念 4.7.2 ...

    svelte-super-tiny-icons:超级微型图标作为Svelte组件

    超级超级微型图标 作为Svelte组件。 在尝试一下。 安装 此零依赖库要求Svelte版本> = 3.20,因为它使用$$restProps 。 yarn add -D svelte-super-tiny-icons # OR ... import * as icons from

    AS语言讲义(全)(大纲)

    AS语言大纲,可快速定位指令用法

    super-server-mongo::card_file_box:Mongo数据库对超级服务器的支持

    @ boilerz / super-server-mongo Mongo数据库对超级服务器的支持安装npx install-peerdeps @boilerz/super-server-mongo用法import { Arg , Query , Resolver } from 'type-graphql' ;import * as superServer from ...

    super-server:graph即刻使用带有graphQL类型的快递服务器

    import * as superServer from '@boilerz/super-server' ; import { Arg , Query , Resolver } from 'type-graphql' ; @ Resolver ( ) class GreetingResolver { @ Query ( ( ) => String ) public hello ( @ Arg ...

    PRGradientView:iOS中径向或线性渐变需求的简单解决方案

    示例便捷方法使用- ( void )viewDidLoad { [ super viewDidLoad ]; // Have a simple red radial gradient as the main background for this view controller. // The convenience method creates a gradient view ...

    Control Freak 2 Touch Input2.2.3

    Super Touch Zone, the most advanced control type of the pack, lets you bind every finger gesture imaginable - for example, single-finger tap can act as a right mouse button click, swiping ...

    高考英语3500词汇(绝对有用)MP3文件+WORD文档资料.zip

    3.●abnormal adj.不正常的,畸形的,反常的 They thought his behavior was abnormal. 反义词:normal 4. ◎aboard prep. adv.在船(飞机,火车)上,上船(飞机,轮船) all the people aboard 机上的人 5. about ...

    SAP屠夫作品汇总

    (3)使用PA Planning Framework(KEPM ) 589 (4)PA Valuation Stratege 595 MM Material Management 595 PO Account Assignment 增强 Coding Block 596 Background: 599 1.Related IMG 599 Step 1.Define valuation ...

    super-rss:图书馆获得RSS提要,即使目标网站没有提供RSS提要

    用法尝试多种方法来创建RSS源,从更自然到最“ hacky” ( require '[super-rss :as sr]])( sr/get-feed " http://website.com/ " {} {}); Return{ :method [ :find-rss-url " http://website.com/posts.atom " ], :...

    c语言课程设计-小型超市管理系统.doc

    3 2.3系统模块的运用方法 3 2.3.1输入记录模块 3 2.3.2查询记录模块 3 2.3.3输出记录模块 3 3详细设计使用 4 3.1数据定义 4 3.2主函数流程图 5 3.3源程序 7 4调试分析 8 4.1进入主界面 8 4.2 系统菜单界面 8 4.3 ...

    super-three.js:threejs的加强版

    该项目的目标是创建一个易于使用、轻量级、带有默认 WebGL 渲染器的 3D 库。 该库还在示例中提供了 Canvas 2D、SVG 和 CSS3D 渲染器。 —— ———— — 用法 这段代码创建了一个场景、一个相机和一个几何立方体,...

    cms后台管理

    类ContentListDirective继承自AbstractContentDirective,最主要的是execute方法 public class ContentListDirective extends AbstractContentDirective { /** * 模板名称 */ public static final String TPL...

    android-iconify:Android integration of multiple icon providers such as FontAwesome 在Android中使用Font Awesome图标

    Iconify为您提供了大量可供选择的矢量图标,以及在Android应用程序中添加和自定义它们的直观方法。 该项目基于 。 由于所有者放弃更新该项目, 安装 选择任意数量的模块,然后在您的Application声明它们。 ...

    基于JSP技术的银行管理系统的毕业设计与实现.doc

    目 录 前言 1 1 需求分析 2 1.1 设计思想 2 1.2 本课题的研究意义 2 1.3 系统设计目的: 3 1.4 系统运行环境 3 1.4.1 系统配置概述 3 1.4.2 JSDK的安装和配置 3 1.4.3 安装和配置Web服务器 4 1.4.4 数据库连接 5 ...

    pytorch 在sequential中使用view来reshape的例子

    pytorch中view是tensor方法,然而在sequential中包装的是nn.module的子类, 因此需要自己定义一个方法: import torch.nn as nn class Reshape(nn.Module): def __init__(self, *args): super(Reshape, self).__...

    Android Service中使用Toast无法正常显示问题的解决方法

    本文实例讲述了Android Service中使用Toast无法正常显示问题的解决方法。分享给大家供大家参考,具体如下: 在做Service简单练习时,在Service中的OnCreate、OnStart、OnDestroy三个方法中都像在Activity中同样的...

Global site tag (gtag.js) - Google Analytics