2009-12-11 7 views
0

S'il vous plaît aider Stackoverflow! J'ai une classe MapInterface dans AS3 qui hérite de la classe Interface.AS3 problème d'héritage de classe

public class Interface extends Sprite { 
    public function Interface(){ 
     // do stuff 
    } 
} 

puis

import com.georgecrabtree.Interface; 

public class MapInterface extends Interface { 
    public function MapInterface(){ 
     addMapButtons(); 
    } 
    public function addMapButtons():void { 
     trace("init"); 
    } 
} 

tout cela fonctionne très bien, et quand je crée une nouvelle classe de MapInterface de la classe de document qu'il trace sur initialisation. Mais quand je tente d'appeler ceci:

var mapInterface:MapInterface = new MapInterface(); 
mapInterface.addMapButtons(); 

du scénario principal que je reçois cette erreur:

1061: Call to a possibly undefined method addMapButtons through a reference with static type com.georgecrabtree:Interface. 

Merci d'avance pour toute aide, George

+3

nommer votre interface de classe semble être une chose très risquée à faire, l'interface (avec un i minuscule) est un mot réservé. – grapefrukt

Répondre

0

Si je comprends bien le problème, Je pense que votre deuxième exemple de code a une faute de frappe. J'imagine que c'est en fait:

var mapInterface:Interface = new MapInterface(); 
mapInterface.addMapButtons(); 

Le problème est que votre variable est de type Interface, qui ne définit pas une méthode addMapButtons(). Vous pouvez résoudre le problème en modifiant le type de variable à MapInterface ou en ajoutant une méthode addMapButtons() à Interface et en remplaçant la méthode dans MapInterface.

+0

Merci pour votre aide Richard, mais sûrement si la classe MapInterface étend la classe Interface et que je crée la mapInterface var en tant que MapInterface, elle devrait être de type MapInterface? Aussi, si je trace la trace de la variable (mapInterface) juste avant le addMapButtons(); fonction l'appelle la fenêtre de sortie montre qu'il est de type MapInterface ?! – supercrabtree

+0

Votre code original semble devoir être compilé. Si une variable est typée en tant que superclasse, les propriétés de la classe enfant ne sont pas disponibles (à moins que vous ne convertissiez la variable en type de classe enfant). –

+0

Donc, le code par supercrabtree a eu une faute de frappe? – LopSae

0

Salut les gars merci pour votre aide et votre attention sur celui-ci. Après une bonne nuit de sommeil j'ai finalement compris mon problème. Évidemment, le code que j'ai posté ci-dessus était une version édulcorée de ce que j'avais réellement.

Le problème était que ma classe de document n'allongeait pas Sprite, elle étendait une classe appelée Installation qui étend elle-même Sprite. C'était parce que je faisais 10 installations et ils ont tous un tas de points communs, ils ont tous un économiseur d'écran, une vidéo d'introduction, etc. Ils ont tous une interface aussi, où mon problème est arrivé, comme 9 des installations utiliser la même interface, mais une (l'installation de la carte) nécessaire pour avoir quelques éléments supplémentaires de l'interface graphique.

Mon problème était que ma classe de base d'installation ressemblait à ceci (im montrant une version réduite vers le bas):

public class Installation extends Sprite { 

    protected var _interface:Interface; 

    public function Installation(){ 
     //do stuff 
    } 
} 

Alors, quand mon MapInstallation étendu cette classe dont il a hérité la variable _interface. Alors, quand j'ai créé la variable _interface que le type MapInterface ..

_interface = new MapInterface(); 

..la complier a reconnu la nouvelle MapInterface comme de type d'installation, mais la variable _interface était encore fortement typé comme interface, alors quand j'ai essayé plus tard d'appeler la La fonction addMapButtons() sur _interface, bien que la fonction était là, le complicateur avait d'autres idées. Ma solution était d'utiliser la coulée ..

(_interface as MapInterface).addMapButtons(); 

et tout a fonctionné hunky dory. Merci pour votre aide les gars :)