Вызов функции в другом классе

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

Я пытаюсь вызвать функцию в другой класс после события.

Вот мой код:

Из класса doucment:

 public static function redrawMap():void {
            removeChild(global.world);
            var world:WorldHandler = new WorldHandler(40,30);
            global.world = world;
            addChild(global.world);
            world.mask = MapArea;
        }
  

Из класса, из которого я вызываю:

 WorldDesign.clearButton.addEventListener(MouseEvent.CLICK, clearWorld);    
public function clearWorld(evt:MouseEvent):void{
                WorldDesign.redrawMap();
            }
  

Я не могу заставить ее работать правильно, я получаю странные сообщения типа «Вызов неопределенного метода removeChild», и он указывает на функцию redrawMap. Это означает, что он нашел функцию, но, похоже, я ничего не могу с этим поделать.

Есть идеи?

Комментарии:

1. removeChild является методом экземпляра. Вы не можете вызвать ее изнутри статического метода.

Ответ №1:

Поскольку redrawMap является статическим методом, вам также необходимо вызвать removeChild и addChild, подобные статическим методам:

 public static function redrawMap():void {
    WorldDesign.removeChild(global.world);
    var world:WorldHandler = new WorldHandler(40,30);
    global.world = world;
    WorldDesign.addChild(global.world);
    world.mask = MapArea;
}
  

Ответ №2:

redrawMap() был определен как static метод. Это означает, что он не может получить доступ к каким-либо методам экземпляра, таким как removeChild() .

Решением было бы сделать его методом экземпляра — определить его как public function redrawMap() . Затем вы можете вызвать функцию через экземпляры. То есть вам нужно будет где-то создать экземпляр класса WorldDesign (предположительно, во время инициализации остальной части swf)

 var worldDesign:WorldDesign=new WorldDesign();
  

Затем вы можете вызвать redrawMap() как

 worldDesign.redrawMap()
  

Ответ №3:

Лучший способ — вообще не использовать статический метод. Для этого используйте шаблон Singleton.

 class WorldDesign {
   private static var _instance:WorldDesign;
   public static function get instance():WorldDesign {
      if(!_instance) _instance = new WorldDesign();
      return _instance;
   }
   public function redrawMap():void {
      removeChild(global.world);
      var world:WorldHandler = new WorldHandler(40,30);
      global.world = world;
      addChild(global.world);
      world.mask = MapArea;
   }

}
  

И используйте WorldDesign.instance.redrawMap();