请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站原RIAMeeting

瑞研社区

 找回密码
 立即注册

QQ登录

[ADC视频FlashBuilder4]ActionScript类编程

发表于 2011-7-18 22:13:19 |显示全部楼层
本帖最后由 riameeting 于 2011-7-27 19:51 编辑 5 V+ _" d6 O1 w" L- _4 B. U+ D

8 v2 x# M3 A' k8 zActionScript类编程 - 翻译:RIAMeeting社区翻译小组李立红
; E2 J7 A  c7 ?: Q& R      在上一个视频中您学到了一些基本的面向对象的术语和概念,以及它们如何应用于Flex应用程序的开发。
3 s2 ?2 K6 e' Y      您现在应该明白,MXML中的“标签(tags)”实际上是MXML的类的实例。8 d" `' b* R, T6 f6 V
      您也应该知道如何扩展MXML中的类来创建自己的自定义的Flex组件。2 _) d0 e: S- V/ q6 A5 K" h+ m  t
      在过去的录像,我也简要地提醒您,Flex框架包含两个编程语言。
+ ]' T& S, k( ]0 Y5 b& X+ m) z      MXML是主要用于视觉显示,而ActionScript是业务逻辑和数据处理使用。
% Y7 l: o& Y1 C: g" h! i- O      这是应用程序,您在最后练习中所创建。
2 P: U9 E' U+ W' e* a9 {# H      它显示两个EmployeeDisplay.mxml组件类,它使用从主应用程序传递的雇员形象和全名数据到组件的实例作为属性。
$ |. N* ~/ S) _" C8 L4 @" ?      在段视频中,我会告诉您如何创建ActionScript类。
3 \5 P5 Y8 t3 ?5 L- _7 r7 S9 y      具体来说,我将向您展示如何创建一个非可视(non-visual)数据类,其中包含了雇员的数据传递到EmployeeDisplay自定义组件。
( ]3 j% h  F3 x& U2 K      首先要明确,我将以两个类结束:可视的MXML定义组件类,您在最后练习中所创建的显示图像和雇员的姓名,…….和非可视(non-visual)的ActionScript类,将用于在可视化组件填充数据的实例。
! [2 ~2 s$ t1 ~5 t2 e+ m; x      要创建一个ActionScript类,首先要创建一个具有.as作为文件扩展名的文本文件。$ ]% b2 `( \4 L1 d
      我已经在视频系列中用过几次“包”这个术语而没有完全说明它是什么意思。8 w, x9 D+ U3 C
      本质上包相当于是一个存储ActionScript类的文本文件的目录。
+ T: Z9 y# @" X( L      在上一个练习中,您把EmployeeDisplay.mxml文件存放在一个叫做组件的目录。
0 l0 Q/ S: t. f+ H" Z( T      然后该软件包对EmployeeDisplay类文件来说是目录,关联到包含类文件的目录。
: y! Y6 i9 u4 F' S" K      每个目录之间通过点分隔。
- w; q" u& H: w: z      在这种情况下,包就是components。
0 f' W% O( D4 w' h' ^      如果进一步把组织文件到子目录,然后您也会在包名称中引用子目录。% a  Z8 f' I' }2 U* k1 B$ M  G- S) V
      例如,如果EmployeeDisplay类在被名为display组件的一个子目录的里面,然后包应该就是components.display。
# ?; h2 k$ E! c      就一般约定而言,类名是由名词和形容词而不包括动词组成的。) V; i; g( L7 C3 H7 N' q
      它们也以大写字母开头,并对类名以内的其他单词使用骆驼命名法。
! V4 I& i5 e- o8 j7 h% Z      当您创建一个ActionScript类,您必须在三个地方引用类名称:.as文件的文件名,文件内的类名和构造函数,它是类中一个具有特殊功能的函数。
- r( U9 Q  W3 u/ |0 u2 g      这是基本的语法规则,把类代码放在文本文件中。8 o* Z7 ?5 D7 v2 m4 b
      请注意,类名使用class关键字声明而构造函数使用function关键字声明。' F8 F+ u0 E$ @! @
      类和构造函数之前都加上公有的(public)访问修饰符。- O: Q6 t" T2 U/ k
      实际上,您可以在一个文件中定义多个类,但只能有一个类可以用公有的的访问修饰符定义。
! {7 @- u) J2 V" Y, L      根据我刚才概述的命名规则,因为类和构造函数的名称是Employee,所以您可以推断出文本文件应命名为Employee.as。
. T" P4 [  o( f      package语句还告诉您,Employee.as文件存储在您Flex项目中的components子目录中。
3 Y! t" w6 U& m- ~      您没有在自定义组件的MXML类的中定义构造函数。- x* v, p- P/ N) a9 B
      您只能在一个ActionScript类中创建它们。
7 `# y8 I! @" e      构造函数是一个运行时每个类的实例自动被创建的函数。
; \$ ~- N! g2 b7 `      这意味着它是一个写代码初始化实例的重要地方。
4 q: Q5 G9 v1 V! S: Q% E( D) ~5 g      在ActionScript类中构造函数不是必需的,创建一个被认为是一个很好的做,即使是空的,因而Flex框架将自动生成一个。
+ _5 P" ?7 d1 c. x$ y9 _, X7 l( A( }* V      最后,构造函数不应该定义一个返回类型,即使只是为了表明它是void。
3 E$ v/ s' O; P9 z8 I      您将在后面了解更多函数的返回类型和void语句。. {) e5 B/ U! w3 @
      这可能对您没有多大意义,如果您是刚开始创建函数和方法。
4 l0 L) `4 s) j) X      您将获得更多的经验,在这个系列视频中。5 Z( I) C' C" A" O, i  U' H& G
      现在,只要认识到上面构造函数定义是错的,因为添加了void语句。
; [* B* X( n/ q; Z. |下面的对的构造函数的语法是正确的。
1 i# a+ w  t% B* @2 Z& d& \3 Y      这是此视频的起始文件。0 w' h6 j. o2 t: g
      该代码与之前完全一致,除了我在一些代码中添加的注释。
/ C/ ?+ G+ M6 r/ H2 _+ z1 R7 n      您可以手工编写ActionScript类的代码,但是Flash Builder有一个向导来帮助您。9 [" T2 N% r' K# E0 w
      我右击components目录,因为这是我想要存储新的ActionScript代码的文件。
- R) j" t3 ?+ A4 m: b7 N      我从菜单上选择新建> ActionScript类。7 g1 K1 ^7 }( r1 ?5 u
      请注意,软件包是自动为我填写的。
! Y9 g. E$ u) D      我类命名为Employee并让访问修饰符设置为公有的。
2 {  |$ Q" }* E& H: R" f. v8 E      您可以不修改其他设置,并单击完成。5 W2 r* r' f# Z- j9 o- s( i
      新建的Employee.as文件在编辑器视图中打开代码。
9 m- h6 b1 ?% o      我刚才提到,我希望ActionScript类来存储有关雇员的所有数据。
( G2 [# W3 l+ f! G) P      为了简化起见,我将限制这些数据为名字,姓氏和图像的文件,但代码可以很容易地扩展为包括电子邮件地址,电话号码,蜗牛邮件 地址和更多。! t) u/ [; ]4 j
      我要把我刚才讨论的这些数据的每一个部分创建为类的属性。
) ^8 w! @6 [  A  ~, i      您已经在上一个视频中学习了,如何创建类属性在自定义的MXML组件文件。
( K" x5 z3 F0 Z8 x6 s      规则是完全相同的。. G# H# j" k/ ?
      您首先要声明访问修饰符,然后在该变量名称的前面使用var关键字。$ h, f. g' ~- C$ C- V/ L8 L" B+ a
      最后,您要为该变量定义数据类型。+ O) P" n3 b" B. P0 Q4 W- z
      在MXML类文件,您在脚本标记块中创建属性。( D9 @$ x: c' L4 s
      在一个ActionScript文件中,属性通常声明在构造函数之上而在类文件之中。7 K- q- |1 q* d, A
      我建立一个公有变量imageFile,并设置它的数据类型为String。
" ^6 C# l! R- z6 g      我建立另外两个公有变量,也设置它们数据类型为String,但是命名为名字和姓氏。
4 _+ v0 P& }9 I  E8 Z0 o) _      记得上次视频中,当您给MXML自定义组件实例的属性值赋值时,您给他们在MXML标记的同一行赋值。
. J+ ?& Y8 d0 |2 |% W9 k1 |7 ]2 r      这里是imageFile和fullName属性,被传入了EmployeeDisplay自定义组件的两个实例。8 o$ p7 U, q' @* W
      ActionScript类的属性分配在不同的构造函数定义的参数为基础。+ m6 L. [6 _' d& c, c+ F8 j% E
      要允许一个类来接受的属性值,您可以指定构造函数之间的括号参数。) X. C3 @* m/ v# e7 ?. n
      您给一个参数的构造函数内引用名称的使用和定义该参数的数据类型。
3 e4 K. E, h1 A$ |8 O7 v      最后,在构造函数的内部,您给类属性的参量赋值。1 |* K5 b4 b/ Z  C7 k1 A# c# ?
      在这段代码中,您可以看到,我已经定义了3个与构造函数相对应的参数,但不一样,我的三个先前创建的公有变量。7 r0 x6 `5 \8 x# o, i7 O
      在构造函数内部,我已经分别对参数值imageName,givenName和lastName与类的属性名,imageFile,firstName和lastName做了关联。6 J5 Z; n5 ?- y3 Q6 Y8 e1 ?
      请注意,参数引用名与类属性的名称不同。  _1 {3 y2 }- f# W: _
      这是开发者的常见争论。
8 E' i- L; d9 d  C& b+ e  O$ V% l* ?      一些人更喜欢名称保持不同以避免混乱。
. k" G/ C! }) [3 m      其他开发人员喜欢匹配构造函数参数引用名为类的属性。
& q1 y% @: ^. R- R      但是,这将导致混乱,因为您无法区分代码在构造函数参数还是类属性。
) n* h. s9 o. c4 `* A      您必须使用“this”操作符明确地引用类的属性。/ J' ^4 o. m3 T- V8 e! F
      我在构造函数内部为每一个类属性引用加入“this”操作符。/ F6 y8 ]7 S% j4 B2 w
      “this”操作符是对被创建的类的特定实例的一种自引用。
. i; F% _4 ?) q; F      因此,它指的是类的属性而不是构造函数中的参数引用名。
, N5 V1 a5 \0 E' S6 ~& R      换言之,在左边赋值引用的这些变量是在类中定义的公有变量,而右边赋值引用是指构造函数参数。: O3 l; @6 ^, l. i
      命名构造函数参数与类属性同名,并使用“this”操作符区分它们是我个人的喜好,所以我会在我的代码中使用这种做法。
# Y; W8 O9 n% J! b8 h# w6 Y% _8 m      现在我已经创建了ActionScript类,是表示全体员工数据,我用它来为每个员工创建实例。
% F: N1 p6 g$ M5 d& K      要使用类,我必须首先使用import关键字导入它并引用包和类名到我的应用程序中。( h+ K: A8 ~% o2 |
      我也要为类命名实例和数据类型。
; ~; _& x8 k  U1 v      最后,我将使用new关键字来调用构造函数并传递参数。
8 u6 m, x  b# `5 e1 c+ G( B3 h! L      在主应用程序文件中,我在脚本注释的下面创建脚本标记块。
5 ]  W3 v( _5 N; _      我创建一个私有变量,因为该数据只在这个应用程序中使用。
& t/ B+ Z4 f5 N, X: U$ R      我让它的名称为firstEmployee,数据类型为Employee类,我在这个ActionScript文件里创建了它。. N5 Z; r' z9 ?; Y1 x
      注意,因为我使用提供的代码提示选项,Flash Builder将自动导入类并引用正确的包。
" G5 T9 m0 g+ Q$ B! R- E: R& f      如果您不使用代码提示,您必须记得手动键入import语句。
8 s- ?3 e/ x# z: \; Q: M0 L      我使用new关键字实例化该对象,然后引用雇员构造函数( L# {+ S2 |+ @! Y7 y) ]& x
      在大括号之中,我按照和构造函数中的参数列表中定义的相同顺序,传递雇员的数据。
* g' V' I9 F2 X- _      “abrilliam.jpg”是第一个值。1 S9 |. P+ u& o1 z( [4 \
      “Andrew”是第二个值,而“Brilliam”最后一个值。
; `) r% Q: S% K, z4 G      这也将是一个私有名为secondEmployee的变量,数据类型为Employee类。
* T: J4 _" f' q1 f# O      构造函数参数是“akotter.jpg“,”Annette“和”“Kotter”。
! n& Q# N: y' s  h) h/ x0 s      现在我创建第二组员工的数据。
/ o4 D% T- \; {& h0 a. R" F6 i9 }. u      Employee类,这两个实例包含的数据,我需要传递给EmployeeDisplay自定义MXML组件的。
! j1 [( r! x6 n; Z5 u# J& ^4 j' i" a2 _- k      我将取代从我的ActionScript类的实例数据的可视化组件的数据。7 ]: T% @: x2 D) J
      我用firstEmployee.imageFile绑定的值,为第一个组件填充imageFile属性。: U* D  K$ `$ Z1 @* u2 H; L8 ~
      当我保存文件Flash Builder将重新编译,您可以看到警告消息,指出“数据绑定无法检测到firstEmployee和imageFile变量的赋值。$ Y4 x  o9 E7 p! |$ W* K0 R
      请记住,在ActionScript中创建和用来绑定到MXML组件的变量,必须使用可绑定元数据标签。
7 K& r" K" m! j4 r      我在雇员实例上面输入Bindable元数据的关键字。
7 \( t% Y1 t0 s! z* h      但是当我保存文件时,关于绑定的警告信息仍然存在。" z9 l! \8 g! a) b' N7 e; W; l
      在这种情况下,该消息是指对imageFile属性本身的类定义。
/ V# @  V7 k2 [- U! r% ^      我回到Employee.as文件,并把Bindable元数据关键字放到imageFile属性定义上面。- R* x2 Z2 T9 Z+ H3 _
      当我保存文件,您可以看到警告消息在主应用程序消失。% Y$ n9 n9 x0 F6 K% u. n
      类属性必须是可绑定的,以便在一个UI控件中使用绑定。
! Z! s! [5 @, W( }      如果您要在类中的所有属中使用绑定语句,您可以通过移动Bindable元数据关键字以使整个类成为可绑定的.2 Z- d. k& X7 ?+ q5 _( F. U
      但是要小心,以这种方式过度使用绑定。$ Y2 }' k! d  x" \3 ~
      只有定义为可绑定全班如果您想所有的属性是绑定。, @8 f. `2 ]% R; O2 Y" E2 p
      它们是非常有益的,但他们确实造成创建开销,因为应用程序,然后必须注意对所有这些属性的变化。7 _, M! w# ^7 R* j* G
      我不需要一类这种应用具有约束力,所以我撤消了我的变化。6 c, w7 _9 |- J# T0 B/ C
      回到主应用程序,我添加secondEmployee.imageFile属性,作为值传递到第二个EmployeeDisplay实例.
' i2 L5 |; B& S$ X9 r' l+ l+ r      当我保存应用程序并运行该文件,您可以看到数据正确的传递到两个组件实例,因为他们的图像显示正确。
3 K+ a/ ^, R# r3 P- y. S      但是请注意,我仍然需要传入名字和姓氏的值,因为它们目前是硬编码。+ n! U4 R, W# ~/ h- U$ R
      处理传入自定义组件数据的另一种方法,把它当作是一个对象对待。
2 N0 i5 V) D4 t, T8 b( r      我刚才定义所有雇员的数据为每一个雇员的对象名,firstEmployee和secondEmployee。. p3 U0 k. p5 \
      我可以传入整个复杂的对象到EmployeeDisplay自定义组件。/ A1 H2 t9 \% i3 J( X0 M
      为了做到这一点,我必须先修改EmployeeDisplay自定义组件接收一个复杂的对象而不是两个单独的参数。
) K2 t7 `' _1 w! C. \- z+ \: u      我要在Flash Builder中注释掉这两个可绑定的公有变量,用Ctrl + Shift + C快捷键。) U3 o$ N$ v7 D, `9 [$ F9 w$ R
      接下来我将导入components.Employee类以便MXML文件使用。
" T; }4 Y8 E/ P8 v3 _+ i9 v( H      自定义组件类的一个可绑定公有属性,现在被称为EmployeeData并且是Employee类数据类型。3 w' |, `- @5 ]0 @; x% y" z
      我使用新的EmployeeData对象,更新图像(Image)控件的源属性的绑定。# V# L! ~: C6 G0 Y1 Q2 P* B# ~
      具体来说,我引用imageFile属性的对象中。
! {- ]/ v) E1 z) t9 C6 U' D8 Q      下一步,我删除显示姓名的标签(Label)控件的绑定。' c1 A+ M/ \* t" [
      一会儿我将进一步讨论这个。# U) h5 N2 }: z* Y: G
      我保存文件,并返回主应用程序文件,删除所有自定义组件实例的imageFile和fullName属性。
8 `: L, `9 R# V# Z! f      您可以看到该组件的代码提示包括新的EmployeeData组件属性。) [) p: n; p  W. i2 Z
      而不是通传入两个独立的雇员数据的值,我立刻绑定全体员工的数据实例。
2 n7 e* c& d, N) M6 P& k      为EmployeeDisplay自定义组件,我绑定employeeData的属性到firstEmployee数据实例。
. Z. n- _  Y! t4 r" A      第二个EmployeeDisplay实例绑定到secondEmployee数据实例。3 F$ u' {1 i* Z
      当我保存文件时我看到一个错误消息,因为我添加了一个方括号而不是大括号。
- [8 e# f+ G$ T/ q2 W2 ~1 G2 W      现在,当我保存文件并运行应用程序,您可以看到这两员工的图像而没有他们的姓名。3 ?6 j& W* ~" o! k, E
      在本视频的最后部分,我将填充EmployeeDisplay自定义组件的员工姓名,通过调用一个我会在ActionScript类文件中定义的方法。
: q' p' Z( y( q8 `9 N& q; X      如果您从前面的讨论还记得,方法是类实例可以访问的动作或行为。
$ @, ]( I) q3 j: u: O6 [* ^      一个实例的所有属性对方法而言都是可用的,因此方法通常用于操纵和控制而不改变其基本值属性。
7 {9 H  Q! e5 J" c7 d! `      像属性一样您应该指定访问修饰符,来确定其他代码如何访问方法。, B& ]( I9 I9 s* y7 \
      您可以经常听到的术语函数和使用的方法交换使用。
( ^+ m: Z+ j9 H  Z4 Y" o      虽然这是一个普遍的做法,但是两者有明显的区别。
& F! C+ l" O0 J# y% q, {      函数是一个一般行为。
  ]' |' b9 g( i& u$ b$ H" i      例如,投掷(throw( ))函数可以适用于几乎任何事物。
+ t9 u8 V& a, e# X' x      您可以抛出一个电视机,一盏灯,一把椅子,甚至一辆汽车,如果您足够强壮。; k5 c* t; I0 e" [/ b5 F
      但是方法,一个依赖指定类的行为。
- r6 s  r; K1 |/ _: }4 W      例如,抛出的足球类()方法可以定义您的地方沿着足球的鞋带,然后再丢您的手指。7 L% Y4 J7 e+ s1 c6 }
      一旦定义方法,您要在大括号之间添加逻辑来确定方法的动作。
! o7 |* F2 L- U+ D      我回到Employee.as类文件,并在构造函数下面添加一个函数。
3 ~" ?5 ]5 y+ W5 r: n      这是一个公有函数,我命名为createFullName()。
2 C, v; G% M# c, R      当此函数被调用,它将返回雇员的全名。
2 ^1 Y# S) \8 D& _! ]6 j+ F. U9 L7 a      前面我提到的构造函数没有返回类型。/ |6 ?! x% s7 I$ A$ N1 P
      类方法总是有返回类型。
4 Y. g: h3 p' M      如果该方法不返回值,在函数声明中可以在冒号后面使用void关键字。
7 G3 |8 i- d3 j7 p+ K% p8 ^      由于该功能返回雇员的名字为字符串,我输入数据类型为String。
5 O$ j. T3 m  O% e: z! T      在大括号中我键入return关键字,为方法指定字符串,在这种情况下,调用该方法时字符串回传。
0 i" ^1 X. P# A$ D- V* [" B      我想返回firstName和lastName的类属性通过空格符隔开,所以我输入firstName加上包含空格的双引号,加上lastName属性。
1 R# ?. b2 B# j1 ~      您可能已经注意到,我没有使用“this”关键字来引用firstName和lastName属性。
  M3 K% r) D# A; \      在构造函数内部,必须弄清楚您是引用类属性还是构造函数参数。
0 W; E+ Q; W8 k3 F# c      “this”操作符可以帮助您作出区分。7 t3 V, D6 r7 s" N/ P
      在构造函数以外,构造函数参数不存在,因此当您提到名字或姓氏,Flash Player知道您正在引用类属性。1 ?* L6 e* ?3 ~4 j$ p3 F: f" p
      我保存文件,然后回到EmployeeDisplay自定义组件。- T1 ~8 K2 M4 X! N
      请记住,EmployeeData对象是Employee类的实例,我们刚在类中添加了createFullName( )方法。, U( I# H! O0 z" Y9 \# e. w6 z6 u
      因为这是一个公有方法,我们可以从EmployeeDisplay自定义组件的实例访问它。4 E/ Q6 X+ F( R2 f+ W: e
      在标签(Label)控件的text属性,我加入大括号并调用employeeData.createFullName()方法。) {/ C: d: l( `: S' W" W
      我保存文件。& S0 L  W4 c) G( r
      当我运行该应用程序,您可以看到这两个雇员显示了正确的图像和姓名。
1 z: \, D, d% n      为了继续下一步,请做完名为“创造一个ActionScript类和实例”的练习。
flash-builder-4.gif

使用道具 举报

本文评论

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|关于社区|九州瑞研|瑞研社区   

GMT+8, 2012-5-19 01:02 , Processed in 0.051065 second(s), 26 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部