2014-08-30 102 views
1

回答了我自己的問題:我無法在類中打開任何變量。它們必須在函數中聲明,在這種情況下,初始化(); 實際定義屬性時出現「未定義屬性訪問」錯誤

我有一個名爲 「壽司」

package { 

public class Sushi { 
    private var cName: String; // This is the name of the sushi. 
    private var cBio: String; // This is the description of the sushi. 
    private var cWeight: Number; // This is the weight modifier of the sushi (please keep it between 0.1 and 2.0). 
    //public var cSprite: MovieClip; // This is the sushi's graphic. 
    private var cResist: Number; // This is the sushi's resistance modifier. 

    public function setName(n:String): void { 
     cName = n; 
    } 

    public function setBio(b:String): void { 
     cBio = b; 
    } 

    public function setWeight(w:Number): void { 
     cWeight = w; 
    } 

    public function setResist(r:Number): void { 
     cResist = r; 
    } 

    public function getName(): String { 
     return cName; 
    } 

    public function setCurrentChar(): void { 
     MainClass.curChar = this; 
    } 

} 

}

類......和主類。我的主類創建兩個Sushi對象:test1和test2。

private var test1 = new Sushi(); 
test1.setName("Test1"); 
private var test2 = new Sushi(); 
test2.setName("Test2"); 

每當我運行它,我得到的錯誤「訪問未定義的屬性test1」和test2相同。我做錯了什麼,我如何從錯誤中學習?

回答

0

由於您宣佈您的成員爲private,因此他們無法在課程範圍外訪問。

在類中有訪問修飾符哪些控制範圍。例如:

  • internal —可見於同一封裝
  • private —可見內部以引用在同一類
  • protected —可見在同一類中的引用和參考的派生類
  • public —各處參考可見
  • static —指定屬性屬於類,而不是類

的情況下,在你的榜樣Sushi類,因爲你聲明爲private它們只能由Sushi類可以看到這些成員。

package { 
    public class Sushi { 
     private var cName:String; 

     public function setName(n:String): void { 
      cName = n; 
     } 
    } 
} 

但是,你可以在成員聲明爲public:

package { 
    public class Sushi { 
     public var cName:String; 
    } 
} 

當作爲公衆宣佈,你現在可以訪問他們喜歡的:

var sushi:Sushi = new Sushi(); 
suschi.name = "Kappa Maki"; 

你的解決方法是什麼視爲屬性,其中爲一個變量定義了一個getter和setter。

例如,這裏_price是屬性只有壽司類訪問;然而,它暴露了兩個公共方法來獲取或設置價格值:

package { 
    public class Sushi { 
     private var _price:Number; 

     public function get price():Number { 
      return _price; 
     } 

     public function set price(value:Number):void { 
      _price = value; 
     } 
    } 
} 

這種面向對象的編程概念被稱爲封裝,有助於隱藏內部類的複雜性。

通過消除二傳手,你可以創建一個只讀屬性:

package { 
    public class Sushi { 
     private var _price:Number = 7.99; 

     public function get price():Number { 
      return _price; 
     } 
    } 
} 

現在,你可以檢索得到的價格;但是,您無法設置它。

var sushi:Sushi = new Sushi(); 
trace("price is: $" + sushi.price); // traces: price is: $7.99 

如果嘗試設置屬性,編譯器將拋出一個錯誤:

var sushi:Sushi = new Sushi(); 
sushi.price = 1.99; // throws error: Property price is read-only. 

每它們的初始化,您可以將其默認值直列設置爲自己的定義,如:

package { 
    public class Sushi { 
     public var cName:String = "Kappa Maki"; 
    } 
} 

或者,您可以在聲明new實例時執行的類構造函數中設置它們的初始值:

package { 
    public class Sushi { 
     public var cName:String; 

     public function Sushi { 
      cName = "Kappa Maki"; 
     } 
    } 
}