如何使用actionscript重写动态类中的函数?

如何使用actionscript重写动态类中的函数?,actionscript,blackberry-playbook,dynamic-class,Actionscript,Blackberry Playbook,Dynamic Class,这是一个playbook应用程序 我有两门课: public dynamic class Bullet extends Sprite { public function update():void { x += 5; y += 5; } } public class BulletFactory { public function createFastBullet:Bullet { var result:Bullet = new Bullet

这是一个playbook应用程序

我有两门课:

public dynamic class Bullet extends Sprite {
   public function update():void {
      x += 5;
      y += 5;
   }
}

public class BulletFactory {
   public function createFastBullet:Bullet {
      var result:Bullet = new Bullet();

      result.update = function() {
         x += 10;
         y += 10;
      }
   }
}

这就是我想做的。在actionscript中实现这一点的最佳方法是什么?

您不是这样做的。Dynamic允许您添加任何尚未声明的特殊属性,而不是重写已声明的函数。不要将动态与抽象混淆

试试这样吧

public class Bullet extends Sprite{
    public var speedX = 5;
    public var speedY = 5;

    public function update():void{
       x += speedX;
       y += speedY;
    }
}

public class BulletFactory{

    public static function getFastBullet():Bullet{
        var result:Bullet = new Bullet();
        result.speedX = result.speedY = 10;
        return result;
    }

}
根据您的喜好调整speedX/speedY的公共/私人可见性

另一方面,如果你想在尽可能的字面意义上“动态重写一个函数”,那么总是有这样一个(虽然有点老套,但也是有效的)


你不能那样做。Dynamic允许您添加任何尚未声明的特殊属性,而不是重写已声明的函数。不要将动态与抽象混淆

试试这样吧

public class Bullet extends Sprite{
    public var speedX = 5;
    public var speedY = 5;

    public function update():void{
       x += speedX;
       y += speedY;
    }
}

public class BulletFactory{

    public static function getFastBullet():Bullet{
        var result:Bullet = new Bullet();
        result.speedX = result.speedY = 10;
        return result;
    }

}
根据您的喜好调整speedX/speedY的公共/私人可见性

另一方面,如果你想在尽可能的字面意义上“动态重写一个函数”,那么总是有这样一个(虽然有点老套,但也是有效的)


您可以使用接口、扩展和覆盖的组合来解决您的问题。 下面的代码不会编译,但应该为您提供一个起点

public interface IBullet {
    function update():void
}

public class DefaultBullet extends Sprite implements IBullet{
   public function update():void {
      x += 5;
      y += 5;
   }
}

public class FastBullet extends DefaultBullet implements IBullet{
   override public function update():void {
      x += 10;
      y += 10;
   }
}

public class BulletFactory {
   public function createBullet(bulletType:String):IBullet {
      var bullet:IBullet;
      if(bulletType=="fast"){
        bullet = new FastBullet();
      }else{
        bullet = new DefaultBullet();
      }
      return bullet;
   }
}

您可以使用接口、扩展和覆盖的组合来解决您的问题。 下面的代码不会编译,但应该为您提供一个起点

public interface IBullet {
    function update():void
}

public class DefaultBullet extends Sprite implements IBullet{
   public function update():void {
      x += 5;
      y += 5;
   }
}

public class FastBullet extends DefaultBullet implements IBullet{
   override public function update():void {
      x += 10;
      y += 10;
   }
}

public class BulletFactory {
   public function createBullet(bulletType:String):IBullet {
      var bullet:IBullet;
      if(bulletType=="fast"){
        bullet = new FastBullet();
      }else{
        bullet = new DefaultBullet();
      }
      return bullet;
   }
}

使用!=null以查看是否设置了一个函数,但不会收到编译器警告。我一直使用函数对象代替事件监听器,因为这大约是1000次faster@divillysuasages我发现了我正在谈论的问题。这不是一个空检查,而是一个存在性检查。var-f:函数;if(f)f();我实际上有另一种类型的bullet,叫做WaveBullet,它以正弦波移动,所以它不一定使用speedX和speedY。@Kenneth在这种情况下,您应该使用更经典的继承,并创建一个单独的“WaveBullet”类,在AS3上下文中扩展bullet。正如我提到的,在AS3中重写“抽象函数”的唯一方法是将其定义为var f:function=function(){trace(“我是一个函数”);},但这在AS3中不如创建一个新的特定派生类那样受支持。使用!=null以查看是否设置了一个函数,但不会收到编译器警告。我一直使用函数对象代替事件监听器,因为这大约是1000次faster@divillysuasages我发现了我正在谈论的问题。这不是一个空检查,而是一个存在性检查。var-f:函数;if(f)f();我实际上有另一种类型的bullet,叫做WaveBullet,它以正弦波移动,所以它不一定使用speedX和speedY。@Kenneth在这种情况下,您应该使用更经典的继承,并创建一个单独的“WaveBullet”类,在AS3上下文中扩展bullet。正如我提到的,在AS3中重写“抽象函数”的唯一方法是将其定义为var f:function=function(){trace(“我是一个函数”);},但在AS3中,这不如创建一个新的特定派生类那样受支持。