实际定义属性时“访问未定义的属性”错误

时间:2014-08-30 22:49:07

标签: actionscript-3 flash

回答了我自己的问题:我无法在班级中声明任何变量,就像在我班级中那样。它们必须在函数中声明,在本例中为 initialize();

我有一个名为“寿司”的课程

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相同的错误。我做错了什么,如何从错误中吸取教训?

1 个答案:

答案 0 :(得分:0)

因为您将成员声明为private,所以在课程范围之外无法访问它们。

在类中有访问修饰符,它们控制范围。例如:

  • internal - 对同一个包内的引用可见
  • private - 对同一类中的引用可见
  • protected - 对同一类和派生类中的引用可见
  • public - 随处可见
  • static - 指定属性属于类,而不是类
  • 的实例

在您的示例Sushi类中,因为您将这些成员声明为私有,所以只有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只是Sushi类可以访问的属性;但是,它公开了两种公共方法来获取或设定价格值:

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

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

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

这种面向对象的编程概念称为封装,有助于隐藏类的内部复杂性。

通过删除setter,您可以创建只读属性:

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";
        }
    }
}