2013-07-20 33 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

相關問題