Skip to content

Typcasting mit MovieClips

2004 August 6
by Sven Busse

Juten Tach,
letztens bin ich in einem Workshop ganz schön ins Schwitzen gekommen. Nicht nur, weil es so heiß ist zur Zeit, sondern weil ich was zeigen wollte, was natürlich nicht geklappt hat. Zunächst hatte ich erstmal eine Klasse geschrieben, die von MovieClip erbt und die das Interface SimpleMovie implementiert:
Hier das interface SimpleMovie:

interface SimpleMovie {
   public function machWas():Void;
}

Hier die Klasse MovieClip1:

class MovieClip1 extends MovieClip implements SimpleMovie {
   public function machWas():Void {
      trace("MovieClip1 schreit.");
   }
}

Dann hatte ich ein Factory Klasse geschrieben, die jetzt für ihren Client einen MovieClip vom Typ MovieClip1 erzeugen sollte, nach dem Factory Design Pattern Prinzip(unwichtiges habe ich hier aus Platzgründen weggelassen):

class MovieFactory {
   public function getSimpleMovie():SimpleMovie{
      var tempMovie:SimpleMovie;
      tempMovie = _root.attachMovie("movie1", "someMovie", 1);
      tempMovie._x = 100;
      tempMovie._y = 100;
      return tempMovie;
   }
}

So, nu’ hat dann irgendwann meine ClientKlasse, die ja auch einen SimpleMovie haben will, gesagt: ‘var meinMovie:SimpleMovie = getSimpleMovie();’. Und dann hat natürlich, wie mir jetzt ja auch auch klar ist, der Compiler gesagt, moment mal hat er gesagt, is’ nich’, weil Typ MovieClip ist ja nicht gleich SimpleMovie.
Hää, denk’ ich? Der MovieClip, den ich attached habe, ist vom Typ MovieClip1 und da er SimpleMovie implementiert, müsste Flash das doch typcasten können?!
Nee, ganz falsch, weiß ich nun. Zum Ersten liefert attachMovie immer einen MovieClip als Rückgabewert zurück und die allgemeine Klasse MovieClip implementiert ja nun mal kein interface SimpleMovie, da kann man also auch nix casten. Und dann castet Flash auch schon mal gar nicht mal so eben von selbst, das muss man schon selber machen.
Also ändert man sein Skript dahingehend:

class MovieFactory {
   public function getSimpleMovie():SimpleMovie{
      var tempMovie:MovieClip1 = MovieClip1(_root.attachMovie("movie1", "someMovie", 1));
      tempMovie._x = 100;
      tempMovie._y = 100;
      return SimpleMovie(tempMovie);
   }
}

So, jetzt casted man als erstes mal nach MovieClip1, was ja vollkommen in Ordnung ist, weil wir haben dem Symbol ja genau diese Klasse zugewiesen und nur die Tatsache, dass Flash immer allgemeine MovieClips zurückgeben will, soll uns da nicht schrecken. Und dann casten wir beim return noch in SimpleMovie, was auch OK ist, weil ja die Klasse MovieClip1 das interface SimpleMovie implementiert und man deswegen auch zu diesem Typ casten kann.
Ja und nu’ klappt alles. Herrlich. Fragt sich nur, warum soviel Aufwand für’n blöden MovieClip …

No comments yet

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS

*