2013-07-20 13 views
0

的东西是错误与我的封装,但我不知道它是什么:AS3为什么我用错误的方式使用get/getter?

我得到了名为Main的文档类绑定到舞台:

package { 

import flash.display.MovieClip; 

    public class Main extends MovieClip 
    { 
    var chapter1:Chapter1; 

    public function Main() { 
     // constructor code 
     chapter1 = new Chapter1; 
     addChild(chapter1); 
    } 
    } 
} 

绑定到一个影片剪辑一个第一章类:

package { 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.TimerEvent; 
import flash.utils.Timer; 

public class Chapter1 extends MovieClip { 

    public var numberOfFrames:uint; 

    public function Chapter1() 
    { 
     numberOfFrames = 3; 

     //constructor 
     trace("Chapter 1 constructed"); 
     Transition.moveFromTo(); 

    } 

    public static function get getNumberOfFrames():uint 
    { 
     return numberOfFrames; 
    } 

} 
} 

和一类称为过渡我喜欢作为一个简单的工具的使用方法:

package { 

public class Transition { 

    public var gotNumber:uint; 

    public function Transition() { 
     trace(Chapter1.getNumberOfFrames); 
    } 

    static public function moveFromTo() 
    { 
     /* in the end id like to use this as a utility working with 
        NumberOfFrames from a parent Chapter instance.*/ 
    } 

} 
} 

我收到一条错误消息,告诉我:“1120:访问未定义的属性numberOfFrames。”所以getter函数本身似乎不被允许使用numberOfFrames。但是我不明白为什么,对于我发现的所有示例(尽管只使用两个类并且没有绑定)使getter返回一个var就像那样。我想念那里的东西吗?

回答

0

您的getNumberOfFrames()函数是一个静态函数,但它试图访问numberOfFrames这是一个实例成员变量。您必须创建Chapter1的实例,以便分配numberOfFrames的实例 - numberOfFrames不存在于特定实例Chapter1之外。

此外,getNumberOfFrames()函数本身需要访问Chapter1实例才能检索其numberOfFrames成员 - 每个实例外都存在一个静态函数。

一个可能的解决方案是将Chapter1实例分配给您的Transition类,以便在尝试获取帧数时可以使用该实例。

如果您的程序中可能有多个Chapter1和多个Transition对象,我建议您从类中删除static关键字,因为所有静态函数都需要一个实例来处理。

+0

thanx。静态关键字很容易删除。但我想通过new关键字和addChild()方法在Main构造函数中创建一个名为“chapter1”的Chapter1实例。我似乎也错了。我想我真的不明白创建实例(darn)... – gauguerilla

+0

@gauguerilla当你创建一个动画片段时,你的确在创建一个实例。但是,该实例不能通过代码直接访问。您必须针对父级影片剪辑调用'getChildByName()'以获取对该实例的引用。一旦你有了它,你就可以访问它的公共属性/方法。 – xxbbcc

+0

@gauguerilla如果您使用'new'在代码中创建影片剪辑,那么您还可以将对该影片剪辑的引用存储在其中一个类的成员变量中(其意义合理),然后再访问它。在这种情况下,你可以避免使用'getChildByName()',它有点贵。 – xxbbcc

0

您已将getter定义为静态。只是删除了static关键字:

public function get getNumberOfFrames():uint 
{ 
    return numberOfFrames; 
} 

定义一些静态意味着该类的每个实例使用属性或方法的一个实例 - 即时猜测这是不是你想要的(想必你创建的每个章节可能有不同numberOfFrames的值?)

+0

到底!我想用不同的numberOfFrames创建不同的章节,但是使用Transition类中所有相同的方法。感谢您的快速回答。似乎我有更多的错误方式(instanciating chapter1,请参阅xxbbccs评论)。删除静态关键字只会产生另一个错误:“1119:通过静态类型类的引用访问可能未定义的属性getNumberOfFrames”。该信息为 – gauguerilla

相关问题