Как переопределить функцию в динамическом классе с ActionScript? - PullRequest
0 голосов
/ 11 марта 2011

Это приложение для 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?

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Вы так не делаете.Динамический - это позволяет вам добавить любое специальное свойство, которое еще не объявлено, чтобы не переопределять уже объявленные функции.Динамическое не следует путать с абстрактным.

Попробуйте что-то вроде этого вместо

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 class AbstractBullet extends Sprite{

    public var update:Function; // <- Notice that function is just a variable here.

}

Затем в вашей фабрике маркеров вы можете назначитьфункция обновления на разовой основе.Обратите внимание, что это менее «безопасно», поскольку вы теряете все представления о безопасности типов, поскольку обновление больше не имеет установленной подписи.Вы также должны убедиться, что он существует, прежде чем позвонить.Вы должны сделать проверку нуля явной, если хотите избежать предупреждения компилятора.

var f:Function;

// this is fine.
// it's particularly safe if 
// f is a declared variable of type
// Function.
if(f != null) f();

// this is also fine,
// and is preffered if f is NOT
// a defined variable but instead
// a dynamically created (and therefore
// untyped) variable of a dynamic object.
// You would not want to "call" something
// that is not a function, after all.
if(f is Function) f();




// but this gives a warning
// even though the code works
// correctly at runtime.
if(f) f();
1 голос
/ 11 марта 2011

Вы можете решить вашу проблему, используя комбинацию интерфейсов, расширений и переопределений. Нижеследующее не скомпилируется, но должно дать вам отправную точку.

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