2011-12-29 2 views
2

Я не могу описать ситуацию короче, поэтому я опишу ее подробно.AS3 Ошибка 1120, после расширения класса

Я создал класс, расширенный из MovieClip. Это выглядит следующим образом:

// Libraries are imported 

    public class WindowObject extends MovieClip { 
     public function WindowObject():void { 
      dragArea_mc.addEventListener(...); 
     } 

     public function AFunction():void { 
      if(close_mc == null) { 
       // Do something 
      } 
     } 
    } 

Где dragArea_mc есть (или должны быть) определен в MovieClips, которые используют это в качестве базового класса.

Я создал MovieClip с двумя детьми MovieClips, названными как dragArea_mc и close_mc, и установил его базовый класс на вершину. Он работал нормально. Совершенно никаких проблем.

Поскольку разные окна имеют разные типы поведения, я хотел создать несколько других классов на основе WindowObject. (т. е. они расширяют WindowObject и имеют дополнительные функции.)

Я изменил базовый класс MovieClip, созданный на шаге 2, на новый класс. Теперь, вот проблема:

1120: Access of undefined property dragArea_mc. 
    1120: Access of undefined property close_mc. 

Когда я нажал на ошибки, они перенаправляются меня к классу WindowObject.

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

+0

попробуйте определить класс как 'public dynamic class' –

+0

Спасибо за быстрый ответ. Я попытался изменить «открытый класс WindowObject» на «открытый динамический класс WindowObject», но он по-прежнему имеет те же ошибки. –

+0

Кроме того, я добавил «динамический» в новые классы, он не может решить проблему. –

ответ

0

Хорошо, я просто загорелся Flash CS5, и воспроизведена проблема. И я должен признать, что я немного озадачен ... И мне придется исследовать немного больше, потому что я не уверен, что действительно понимаю, что происходит.

Попробуйте установить оба класса в public dynamic class...

, а затем вместо ссылки dragArea_mc непосредственно ссылаться на него через this.dragArea_mc

что я закончил тем, что:

public dynamic class TestParent extends MovieClip { 
    public function TestParent() { 
     // trace(drag_mc); doesn't work 
     trace(this.drag_mc); // works as long as the class is dynamic 
    } 
} 

public dynamic class TestChild extends TestParent { 
    public function TestChild() { 
     // trace(drag_mc); surprisingly does work, but odd it doesn't work in the parent. 
     trace(this.drag_mc); // works as long as the class (and its parent) are dynamic 
    } 
} 

, а затем в UI, созданный новый MovieClip и установите его базовый класс в TestChild и создайте дочерний мувиклип с именем экземпляра drag_me.

... Я собираюсь расследовать больше и отредактировать это сообщение позже, но попробуйте это и посмотрите, поможет ли оно исправить вашу проблему.

+0

Спасибо за помощь! Итак, мне нужно добавить «динамический», а также «это». Теперь он отлично работает. Ура! –

+0

Интересно, что мне сказали, что не используйте «это». если это возможно, потому что это повлияет на производительность. Но на этот раз «это». необходим. ОРЗ –

-1

может быть неопределенным, потому что это не на сцене довольно yet..try его как этот

// Libraries are imported 

class WindowObject extends MovieClip { 
    public function WindowObject():void { 
     addEventListener(Event.ADDED_TO_STAGE, init); 
    } 

    private function init(e:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 
     dragArea_mc.addEventListener(...); 
    } 

    public function AFunction():void { 
     if(close_mc == null) { 
      // Do something 
     } 
    } 
} 
+0

Думает быстро реагировать. Но я думаю, что это не проблема, потому что она также говорит, что close_mc не определен. –

+0

@Ronnie Экземпляр DisplayObject не должен находиться на сцене, чтобы существовать ... – Marty

Смежные вопросы