Creation d'instances de classes dynamiques

Résolu
Signaler
Messages postés
5
Date d'inscription
samedi 2 décembre 2006
Statut
Membre
Dernière intervention
5 décembre 2006
-
Messages postés
5
Date d'inscription
samedi 2 décembre 2006
Statut
Membre
Dernière intervention
5 décembre 2006
-
Bonjour à tous et merci pour tout ce qu'on peut apprendre ici.

Je débute en poo sur as2. Et j'ai un souci pour fabriquer dynamiquement des instances d'une classes à l'intérieur d'une méthode d'une autre classe et pour les stocker dans un tableau. Je pourrais m'y prendre autrement mais ça m'économise du code et ne serais-ce que pour ma culture personelle je voudrais bien comprendre ce qui cloche. Sur as1 hors poo ce genre de truc marchait bien, mais ici rien du tout. J'ai fouillé sur le forum et sur le web, dans le Moock aussi sans résultat ou des codes trop pointus  pour moi.

Le code ressemble à ça :
 
dans A.as :

class A {
    // le tableau a remplir
    private static var leTableau:Array;
    // des tableaux des noms à utiliser
    public var minuscules:Array = ["a", "b", "c", … "n"];
    public var majuscules:Array = ["A", "B", "C", … "N"];
    // initialisation
    public function A() {
    // le code d'initialisation
    }
    // la méthode en question
    public function CreerInstancesDeB():Void{
       for (var j = 0; j<=50; j++) {
            for (var i = 0; i<=50; i++) {
                var objetEnCours:Object = minuscules[j]+majuscules[i];
                objetEnCours = new B(param1, param2);
                leTableau.push(objetEnCours);
            }
        }
    }
    trace(leTableau);
}

et dans le swf j'appelle :

leA = new A();
leA.CreerInstancesDeB();

Il m'appelle bien la fonction constructeur de B n fois (j'ai mis un trace() pour valider), avec les bon paramètres et tout, mais quand j'essaye d'invoquer trace() sur "objetEnCours" j'ai : "undefined", et quand à la fin de la fonction je trace "leTableau" j'ai aussi "undefined". Donc je m'y prends mal ! J'ai fais des test avec eval(), [], this[] ou push(new B(param1, param2)) toujours "undefined", et dans le dernier cas l'objet n'a pas de nom ce qui m'embête pour la suite.

Voilà, à votre bon coeur messieurs dames !
Merci d'avance.

5 réponses

Messages postés
5
Date d'inscription
samedi 2 décembre 2006
Statut
Membre
Dernière intervention
5 décembre 2006

Ok.

J'ai du sauter l'épisode dans mes lectures.

Merci bien pour l'info. Pour moi c'est ok pour clore le sujet.
Messages postés
1203
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
23 juillet 2009
2
Salut,

var objetEnCours:Object = minuscules[j]+majuscules[i];
-> que veux tu faire précisément là ???

Déjà je commencerais par instancier le nouvel Objet
var objetEnCours:Object = new Object()

ensuite tu peux lui affecter des parametres comme
objetEnCours.minuscule =minuscules[j];
objetEnCours.majuscule= majuscules[j];
ou encore
objetEnCours.nom= minuscules[j]+majuscules[i];
Cela devrait résoudre en même temps ton problème de tableau trace(leTableau)
PS : dans tes tableaux, c'est quoi le ?
public var minuscules:Array = ["a", "b", "c", ? "n"];

@+
Messages postés
5
Date d'inscription
samedi 2 décembre 2006
Statut
Membre
Dernière intervention
5 décembre 2006

Salut Girou, c'est super sympa de répondre.

Alors en fait avec pour éclaircir les points pas clair de mon code :

var objetEnCours:Object = minuscules[j]+majuscules[i];

j'essaye de creer dynamiquement un nom unique pour mon instance.

Et le "?" du tableau c'était juste pour dire que je ne connais pas sa longueur, pas très adroit désolé.

En fait j'ai résolu mon problème avec ça :

this[minuscules[j]+majuscules[i]] = new B(param1, param2);
leTableau.push(objetEnCours);

Mais ça ne marche que si on à initialisé "leTableau" avant dans la fonction constructeur, genre :

leTableau = [];

C'est normal ou c'est un bug ?

Je ne sais pas si c'est très orthodoxe ce que j'ai fait, je vais tester aussi plus dans l'esprit de ta méthode.

Encore merci,
Messages postés
5
Date d'inscription
samedi 2 décembre 2006
Statut
Membre
Dernière intervention
5 décembre 2006

oups ! envoyé trop vite, il faut lire :

this[minuscules[j]+majuscules[i]] = new B(param1, param2);
leTableau.push(this[minuscules[j]+majuscules[i]]);

Est-ce qu'on peut éditer un message ? Je n'ai pas trouvé.
Messages postés
1203
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
23 juillet 2009
2
Salut,

oui, c'est normal.
Tu dois premièrement instancier le tableau dans le constructeur, sinon tu introduis des objets dans un tableau qui n'existe pas... ce qui provoque bien sur une erreur

@+