2014-08-30 104 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"; 
     } 
    } 
}