Flashhilfe.de - Flash Community

switch mit Datentyp Prüfung - is Operator Ersatz [Flash 10]

 


AntwortenRegistrieren Seite1  

Sebastian#1
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

10.05.2011, 14:36

Für das Ermitteln eines Datentyps kann man wie üblich den Operator "is" verwenden. Wenn man jedoch mehrere Klassen auf eine Instance abfragen möchte, macht es Sinn einen "switch case" zu verwenden. Dies ist jedoch nur durch einen kleinen "Trick" möglich.

Wenn man die jeweilige Instance auf Object castet, kann man per constructor auf den Datentyp abfragen. Das sieht dann so aus:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
var myInstance:IMyInterfaceClass = new MyClass();

switch(Object(myInstance).constructor)
{
       case MyClass:
           trace("myInstance is from type MyClass");
       break;
 
      case MyOtherClass:
           trace("myInstance is from type MyOtherClass");
       break;
 
}


Wir haben also eine Instance die das Interface IMyInterfaceClass implementiert hat und können so prüfen ob es sich um die Klasse MyClass oder MyOtherClass handelt.
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
Schlagwörter: constructor, Datentyp, switch
Werbung
Beiträge: 0
Registriert: Feb 2016


cedddy#2
Benutzerbild von cedddy
Beiträge: 572
Registriert: May 2007

10.05.2011, 14:55

okay und was macht man wenn man auf fertige klassen wie einen movieclip zugreifen will wo man nicht einfach sagen kann das er mein interface implementiert ? könnte man dafür dann auch z.b nen iEventDispatcher check machen da der ja vom movieclip implementiert wird ... .
Bitte keine pn´s wegen irgendwelchen fragen zu Threads, dafür gibt es sie ja schließich
Sebastian#3
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

Themenautor/in

10.05.2011, 17:53

Dann arbeitest Du wohl mit Flash wo dieses möglich ist. Normalerweise sollte es keine reinen MovieClips geben sondern nur Klassen die von MovieClip erben.

Dein switch würde dann so aussehen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
var myInstance:MovieClip = new MyClass();

switch(Object(myInstance).constructor)
{
         case MyClass:
             trace("myInstance is from type MyClass");
         break;
   
         case MyOtherClass:
             trace("myInstance is from type MyOtherClass");
        break;
   
}

Beide Klassen erben von MovieClip. Dies kannst Du z.B. auch machen wenn Du Deine MovieClips in der Bibliothek hast und sie für AS exportierst.
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
badskill#4
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

10.05.2011, 22:28

Hi,
ich werf hier mal eine andere Version rein:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
var s:Shape = new Shape();
var iv:IVisualElement = new SpriteVisualElement();
switch (getDefinitionByName(getQualifiedClassName(iv)))
{
       case SpriteVisualElement :
            trace('type SpriteVisualElement');
       break;
       case Shape :
     trace('type Shape');
       break;
}

Über die Methode describeType könnte man sich durch die komplette Vererbunghierachie sowie sämtliche implementierten Interfaces durchhangeln. Reflection halt. :)
Werbung
Beiträge: 0
Registriert: Feb 2016


omega psi#5
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

23.08.2011, 15:21

Aber gibt es einen Gewinn bei den Ansätzen? badskills Lösung ist unverhältnismäßig teuer im Verglich zum Nutzen und der "switch case" ist nicht wirklich flexibel.
Architectures - Refactoring - Prototyping - Coding - Training
Sebastian#6
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

Themenautor/in

23.08.2011, 16:06

Die erste Variante wird nativ unterstützt und sollte entsprechend schnell sein. Die Version von Mario wird in der Tat sehr langsam sein und wäre mir auch zu umständlich. Ich denke Mario wollte auch nur zeigen wie es sonst noch möglich ist.

Generell hat der switch den Vorteil der Übersichtlichkeit. Klar kann man auch alles mit if else und is lösen. Dies kann aber sehr schnell unübersichtlich werden. Deswegen wollte ich hier zeigen wie man dies gewohnt mit einem switch lösen kann.

Viele Grüße,
Sebastian
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
omega psi#7
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

23.08.2011, 16:21

Naja, aber es bringt nichts, da es gegen die Polymorphie arbeitet, daher nicht wirklich verwendbar ist.

Nach dem ersten Treffer steigt der switch aus, was aber bei mehreren Treffern unglücklich ist. Oder man programmiert ein Fallthrough-statement, das aber auch nicht gewährleistet, dass
a) das Typproblem gelöst wird
b) eine Lösung für ein mögliches Reihenfolge bietet

Besser wären:
ActionScript:
1
2
3
4
5
6
7
package fs
{
    public function objectIsType(o:*, type:Class):Boolean
    {
      return o is type;
    }
}
Oder eine auf Polymorphie ausgerichtete Typprüfung:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function typeCheck(o:*):*
{
    const displayObject:DisplayObject = o as DisplayObject;
    if (displayObject)
    {
      // a DisplayObject instance is found
  }
 
    const sprite:Sprite = o as Sprite;
    if (sprite)
    {
      // a Sprite instance is found
  }
 
    const bitmap:Bitmap = o as Bitmap;
    if (bitmap)
    {
      // a Bitmap instance is found
  }
 
    return o;
}
Das ist nur ein kleines Beispiel, wie man flexibler mit Typen umgehen kann. Sinn macht das ganze wirklich im Hinblick auf Polymorphie verschiedenener Typen, die durch Interfaces implementiert ist, und da ist das switch Beispiel nie eine Lösung -> switch skaliert nicht.
Architectures - Refactoring - Prototyping - Coding - Training
Sebastian#8
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

Themenautor/in

23.08.2011, 16:51

In Deinem Beispiel sollte man sich überlegen ob switch die richtige Lösung ist. Ein switch soll einfach auch nicht mehr machen als eine Variable auf unterschiedliche Werte prüfen. Nicht mehr und nicht weniger.

Beispiel mit Deiner Variante:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(myInstanceo is DisplayObject)
{
     // a DisplayObject instance is found
}
else if(myInstance is Sprite)
{
     // a Sprite instance is found
}
else if(myInstance is Bitmap)
{
     // a Bitmap instance is found
}
else
{
     //
}


Mit der oben erwähnten Variante:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
switch(Object(myInstance).constructor)
{
     case DisplayObject:
        // a DisplayObject instance is found
   break;
     
     case Sprite:
        // a Sprite instance is found
   break;
     
     case Bitmap:
        // a Bitmap instance is found
   break;
     
     default:
        // default
   break;
     
}


Oder:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(myInstanceo is DisplayObject)
{
     // a DisplayObject instance is found
}
else if(myInstance is Sprite || myInstance is Interface)
{
     // a Sprite or Interface instance is found
}
else if(myInstance is Bitmap)
{
     // a Bitmap instance is found
}
else
{
     //
}



Andere Lösung:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
switch(Object(myInstance).constructor)
{
     case DisplayObject:
        // a DisplayObject instance is found
   break;
     
     case Sprite:
     case Interface:
        // a Sprite or Interface instance is found
   break;
     
     case Bitmap:
        // a Bitmap instance is found
   break;
     
     default:
        // default
   break;
}


Beim switch ist sofort klar das nur eine Variable auf mehrere Inhalte geprüft wird was mir das Lesen vereinfacht. Aber das ist wie bei vielen Sachen sicherlich eine Geschmacks und Gewohnheitsfrage.

Um noch mal auf Dein Beispiel zurück zu kommen, ein switch ist schon etwas flexibler:
ActionScript:
1
2
3
4
5
6
7
switch(Object(myInstance).constructor)
{
     case DisplayObject:
     case Sprite:
        // script
   break;
}


Oder:
ActionScript:
1
2
3
4
5
6
7
8
switch(Object(myInstance).constructor)
{
     case DisplayObject:
        // script

     case Sprite:
        // script
}

... wobei dann ein "default:" nicht möglich wäre.

Die letzten Variante habe ich so auch noch nie benötigt. Bei der letzten Variante wäre es dann auch wieder fraglich ob swich der richtige Lösungsansatz wäre.

In meinem Fall brauchte ich diese Variante nur dafür um zu sehen welches Interface die Instance implementiert hat und da wollte ich direkt bei einem Treffer aussteigen. In dem Fall finde ich die erste Lösung auch nach wie vor am übersichtlichsten.
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
Geändert von Sebastian am 23.08.11 um 16:52 Uhr
omega psi#9
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

23.08.2011, 17:04

Du hast das Problem nicht verstanden. Es geht um Polymorphie im Umgang mit Klassen, deswegen macht der Switch nie einen Sinn.
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
switch(Object(myInstance).constructor)
{
       case DisplayObject:
          // a DisplayObject instance is found
   break;
      
       case Sprite:
       case Interface:
          // a Sprite or Interface instance is found
   break;
      
       case Bitmap:
          // a Bitmap instance is found
   break;
      
       default:
          // default
   break;
        
}
Wie willst du in sicherstellen, dass jede Klasse, die ein Sprite ist, auch vom Typ des Interfaces ist? Das kannst du nicht und das ist auch nicht objektorientiert/polymorph.
Architectures - Refactoring - Prototyping - Coding - Training
Geändert von omega psi am 23.08.11 um 17:04 Uhr

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de