【问题标题】:Error when using getter/setter methods on Sprite在 Sprite 上使用 getter/setter 方法时出错
【发布时间】:2011-08-02 16:14:26
【问题描述】:

我正在尝试创建一个扩展 Sprite 的类,附加一些私有属性,并且能够使用 getter 和 setter 读取和写入这些属性。 简单...但是编译器抛出此错误“通过静态类型 flash.display:Sprite 的引用访问可能未定义的属性速度。” 如果我将我的类设置为扩展 MovieClip 对象,它会起作用。 有人可以解释一下这背后的逻辑吗?为什么我不能在 Sprite 中使用 getter 和 setter?

这是一个示例代码:

package  {

    import flash.display.Sprite;

    public class Vehicle extends Sprite{

        private var _speed:uint = 3;


        public function get speed():uint {
            return _speed;
        }

        public function set speed(value:uint):void {
            _speed = value;
        }


        public function Vehicle() {
            super();
        }

    }

}

【问题讨论】:

  • 您的车辆实例是 Sprite 类型还是 Vehicle 类型?如果是前者,则需要在获取/设置道具之前将其转换为 Vehicle。
  • 你可以用get/set和Sprite一起使用,肯定是其他地方有问题。请在您实例化车辆的位置以及使用访问器的位置发布代码。
  • 我是这样做的:var vehicle:Sprite = new Vehicle(); addChild(车辆);
  • 谢谢,如果它被声明为Vehicle。
  • 另外请记住,在某些情况下,最好将其键入为 Sprite 并通过强制转换访问其独特属性。前任。 (车辆作为车辆)。速度。这样你就可以使用相同的变量,但在不同的实现中为相似的类型拆分逻辑

标签: actionscript-3 class static setter getter


【解决方案1】:

您需要声明 Vehicle 的实例,因为 Sprite 不像 Movieclip 那样动态。

所以,这样做是行不通的:

var vehicle:Sprite = new Vehicle;
vehicle.speed = 5;

这应该可行:

var vehicle:Vehicle= new Vehicle;
vehicle.speed = 5;

var vehicle:Sprite = new Vehicle;
Vehicle(vehicle).speed = 5; //We cast the vehicle instance to Vehicle type.

此外,我们可以使用as 运算符进行转换:

var vehicle:Sprite = new Vehicle;
(vehicle as Vehicle).speed = 5; //We cast the vehicle instance to Vehicle type.

【讨论】:

  • 别忘了调用构造函数:new Vehicle();
  • @Mark Knol:我正在调用构造函数,也许您对第二种情况感到困惑,我是在将车辆实例转换为 Vehicle...
  • @golia,Mark 可能被您选择不使用括号误导了。虽然在没有参数时省略它们有效,但它会让 Adob​​e 推荐的代码标准生气,并且一些不知道它们可能会被省略的人感到困惑。
  • @sam 你是对的,不知道那个语法。我看起来有点困惑,就像你不调用构造函数一样。谢谢。
猜你喜欢
  • 2011-04-14
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多