Приведение параметров AS3 - PullRequest
0 голосов
/ 22 октября 2011

У меня есть простой вопрос, в приведенном ниже примере, когда я создал новый TransitionManager и передал this в качестве параметра, произошла ошибка, в которой говорится, что неявное принуждение this имеет тип Class.WhI мне нужно типизировать объект в порядкечтобы работать, я думал, что объект становится MovieClip после того, как он расширяет его.

package {

 import fl.transitions.*;
 import fl.transitions.easing.*;
 import flash.display.MovieClip;
 import flash.events.MouseEvent;

 public class Border extends MovieClip
 {   
   var trManager:TransitionManager = new TransitionManager( MovieClip(this) ); //<--

   public function Border( ) {
   }   

   public function doRotate ( ev : MouseEvent)
   {
      trManager.startTransition({type:Rotate, direction:Transition.OUT, duration:3, easing:Strong.easeInOut, ccw:false, degrees:90});
   }
  }
 }

1 Ответ

1 голос
/ 23 октября 2011

Похоже, вы наткнулись на странную странность в компиляторе Flex.

Некоторое время казалось, что this относится к статическому типу класса, но я ошибался, похоже,просто ошибка в компиляторе, неправильно интерпретирующая тип this во время компиляции.

Я бы не рекомендовал использовать этот подход, так как члены будут инициализированы до вызова конструктора.Посмотрите на этот пример:

package  
{
    public class Foo
    {
        private var bar1:Bar = new Bar("at bar1", Foo(this));

        public function Foo()
        {
            var bar2:Bar = new Bar("in constructor", this);
        }

        private var bar3:Bar = new Bar("at bar3", Foo(this));
    }
}

class Bar {

    public function Bar(scope: String, x:*):void {
        trace(scope, x is Foo);
    }

}

, и очевидный ответ таков:

at bar1 true
at bar3 true
in constructor true

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

В заключение, сделайте это просто, переместите инициализацию поля в конструкторе, это то, для чего они в любом случае.

var trManager:TransitionManager;

public function Border( ) {
    trManager = new TransitionManager(this);
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...