Forums Développement Multimédia

Aller au contenu

Égaliser 2 instances d'une même classe

CODE as3

10 réponses à ce sujet

#1 the_little_boy01

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 65 messages

Posté 28 May 2018 - 17:35 PM

Bonsoir à tous,
J'ai un petit problème, sans doute très simple mais bizarrement je ne trouve pas la solution , ni sur le forum ni sur internet.

En fait c'est tout bête, j'ai 2 instances de la classe voiture par exemple voiture1 et voiture2.

Quand je fais, voiture1 = voiture2, j'avais espoir que tout les attributs de voiture2 soit transmis à voiture1. Mais ça ne fonctionne pas.

Le problème, c'est que mes classes ont énormément d'attributs de type int , string... voir même par exemple de type Roue. Donc il est impossible de tout égaliser attributs par attributs. Et même si c'était possible , on revient au même problème pour roueVoiture1 = roueVoiture2 car la classe Roue qui est un attribut de la classe Voiture comporte elle même plusieurs attributs.
Comment puis-je faire svp.


Merci d'avance

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6996 messages

Posté 28 May 2018 - 17:47 PM

Bonsoir,

Je pense qu'il y a une erreur de concept.

Deux instances d'une classe sont tout simplement deux objets issus du même moule (la classe).
Je ne vois pas comment les "égaliser" puisque ce sont déjà deux objets identiques (bien que différents).

Quand tu fais une affectation par référence, ce qui est le cas pour tous les objets complexes (autres que les primitifs : Number, Int, ....) tu fais en fait référence au même objet (situé en mémoire, pour être plus précis c'est le même raccourcis partagé par les deux objets vers celui qui est en mémoire).

Par exemple :


Var tableau1 = [1,2,3];
var tableau2 = tableau1;
tableau2[1] = 5;
trace(tableau1);
trace(tableau2);
 


L'objet de référence a été modifié, ici tableau2 fait référence à tableau1 qui lui même fait référence au tableau contenant les données. Tableau1 et Tableau2 partagent donc la même référence (le tableau de données).

Donc je ne comprend pas ce que tu entend pas "égaliser".

Soit tes deux objets sont issus du même moule (la classe Voiture qui permet de créer Voiture1 et Voiture2), alors il sont déjà identiques (partagent les mêmes membres de la classe).


Class voiture {
//...
public var marque:String = "Ferrari";
//...
}

var voiture1:Voiture = new Voiture();
var voiture2:Voiture = new Voiture();

trace(voiture1.marque);
trace(voiture2.marque);
 



Soit tu souhaite créer une classe plus spécialisée qu'une autre mais qui en reprend les attributs et il faut juste faire un héritage. Une voiture spécialisée pourrait par exemple être un Camion, ça a tout d'une voiture mais aussi un truc en plus (plus gros et plus de roues).


Class Camion extends Voiture {
// les attributs et méthodes spécifiques au camion
}
 


Et si tu veux utiliser la même classe mais avec des valeurs de paramètres différents il suffit de les passer en constructeur ou via des getters/setters :


Class Voiture {

        public var marque:String = "";

        // constructeur
        public function Voiture(_marque:String){
                marque = _marque;
        }

}

var voiture1:Voiture = new Voiture("Ferrari");
var voiture2:Voiture = new Voiture("Fiat");

trace(voiture1.marque);
trace(voiture2.marque);
 


#3 the_little_boy01

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 65 messages

Posté 28 May 2018 - 18:01 PM

Merci beaucoup pour la réponse.

En fait quand je dit égaliser, c'est donner la même valeur à touts les attributs.
Voici un petit code qui sera sans doute un peu plus explicite.

var voiture1:Voiture = new Voiture();
voiture1.couleur = jaune;
voiture1.marque = "Renault";
voiture1.pneu = new Pneu("Michelin", "pluie", 25);
Ainsi de suite il y en a beaucoup

var voiture2:Voiture = new Voiture();

je veux maintenant que ma voiture2 soit jaune, de marque renault, avec des pneu Michelin de type pluie de 25 pouces.
Donc j'ai essayé

voiture2 = voiture1 et voiture2 == voiture1 mais ça marche pas.


Encore merci

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6996 messages

Posté 28 May 2018 - 18:12 PM

Pour moi, les attributs par défaut dont déjà valorisés dans la classe directement.

Ensuite si tu dois paramétrer un objet avec beaucoup de paramètres identiques utilise des tableaux de données, exemple :

var voitureDuFacteur:Array = ["jaune", "Renault", ["Michelin", "pluie", 25], ........... ];

Puis dans la Classe tu gère la valorisation au niveau du constructeur :


Class Voiture {

        public var couleur:String = "blanc"; // valeur par défaut
        public var marque:String = "Peugeot"; // valeur par défaut
        public var pneux:Pneux; // objet par défaut non instancié

        public function Voiture(valeurs:Array){
                couleur = valeurs[0];
                marque = valeurs[1];
                pneux = new Pneux(valeurs[2][0],valeurs[2][1],valeurs[2][2]);
                //.....
        }

}
 

Et enfin tu crée tes voitures :


var voiture1 = new Voiture(voitureDuFacteur);
var voiture2 = new Voiture(voitureDuFacteur);
 

Et si tu veux juste modifier un paramètre tu peux toujours le faire après instanciation :


var voiture1 = new Voiture(voitureDuFacteur);
var voiture2 = new Voiture(voitureDuFacteur);
voiture2.couleur = "noir";
 

Il y a peut être plus simple, mais il faudrait avoir une vision plus précise de ce que tu cherches à faire.

#5 the_little_boy01

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 65 messages

Posté 28 May 2018 - 18:37 PM

Merci beaucoup,

Déjà je voudrais expliquer pourquoi je n'initialise pas au début la voiture2. En fait la voiture1 change dans le temps.
Par exemple voiture1 est jaune avec des pneus pluie Michelin de 25 pouces , mais après quelques action elle sera rouge avec des Pneus Pirelli.

Je veux juste que ma voiture2 à chaque fois que j'en ai envie est la même couleur, même pneus.. que ma voiture1 (qui change dans le temps)


Ceci dit, je crois bien que c'est ce que je craignais, çà va être fastidieux car comme tu l'imagines, je pouvais faire:

voiture2.couleur =voiture1.couleur
voiture2.marque = voiture1.marque
voiture2.pneu = voiture1.pneu // Ici ça ne marcherait sans doute pas car c'est une variable complexe

Mais en fait il y en a une trentaine et la plupart sont complexes de type pneu tu imagines la taille du tableau?

​Donc si je comprend bien , il n'y a aucune manière simple pour faire que ma voiture2 soit avec les même paramétrés (couleur, marque...) que ma voiture1 ? Comme on peut le faire avec les Numbers du type

var a:Number = 3;
var b:Number = a;

Ou au pire une boucle qui va parcourir tout les attributs est les donner la bonne valeur, c'est à dire parcourir tout les attributs de voiture1 (couleur, marque...) et les donner à voiture2.

Merci

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6996 messages

Posté 28 May 2018 - 18:45 PM

Tu peux imaginer le scénario suivant :

Tu crée ta voiture1 et tu la modifie.
Dans la classe Voiture tu crée une fonction getParams() qui est là pour récupérer les paramètres de l'objet au moment où tu l'appelle :


Class Voiture{

        public function getparams():Array{
                return = [couleur, marque, ....];
        }

}
 

Son but est de récupérer la valeur des paramètres de l'objet au moment où tu le souhaite.
Ensuite il te suffit de réinstancier un nouvel objet avec les paramètres du premier.

var voiture2:Voiture = new Voiture(voiture1.getparams());



Citation

Comme on peut le faire avec les Numbers du type

var a:Number = 3;
var b:Number = a;

Non, comme je le disais au dessus, ce genre de chose ne marche qu'avec des types primitifs du genre : Number, Boolean, String, Int, .... pas avec les types complexes (Object, Array, ....).
Les types complexes utilisent déjà des références stockées en mémoire d'objets plus petits les composants, il s'agit du même raccourcis mémoire pour les deux objets, ce qui crée une dépendance forte (si tu modifie l'un l'autre l'est aussi) ce qui perds beaucoup de son intérêt dans ton cas.

#7 the_little_boy01

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 65 messages

Posté 28 May 2018 - 18:56 PM

Là ça devient intéressant!! ;-) ;-)
Je comprends tout à fait ton idée.

Le seul truc c'est que je vois pas comment quand j'aurais fait:

var voiture2:Voiture = new Voiture(voiture1.getparams());

Ensuite je teste :

trace(voiture2.marque) , je vois pas comment il va afficher //Renault comme celle de voiture1.

Mais je comprends tout à fait l'idée , je vais bidouiller dans ce sens

#8 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6996 messages

Posté 28 May 2018 - 18:59 PM

Citation

Le seul truc c'est que je vois pas comment quand j'aurais fait:

Tu dois combiner ça avec l'idée du tableau de données que je t'ai filé au dessus.
Tu dois passer un tableau ou une liste au constructeur de la classe pour qu'il instancie ton objet.
C'est à ce moment là que tu peux récupérer un tableau de valeurs depuis l'objet d'origine pour le passer en paramètre de ton second objet.

1 - tableau de données par défaut
2 - classe Voiture qui prend un tableau en paramètre pour valoriser les attributs
3 - création de la voiture 1 avec les données par défaut
4 - modification de la première voiture
5 - récupération des valeurs des attributs dans la fonction getParams de la classe voiture
6 - utilisation de ce nouveau tableau pour créer la seconde, troisième,........

#9 the_little_boy01

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 65 messages

Posté 28 May 2018 - 19:04 PM

Ok ok , je teste un peu tout ça.
Finalement c'est pas aussi simple, c'est même assez complexe pour un truc qui parait simple.
Merci beaucoup pour ton aide, je test ça tout de suite

#10 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6996 messages

Posté 28 May 2018 - 19:05 PM

Sinon, tu peux aussi essayer de cloner ou de passer par une boucle qui récupère directement les propriétés, voir : http://gametuts.org/...objects-in-as3/

#11 the_little_boy01

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 65 messages

Posté 28 May 2018 - 19:14 PM

Voilà "cloner" c'est le mot qu'il faut au lieu d'égaliser.
Je regarde çà tout de suite.
Merci beaucoup ;-) ;-) ;-) ;-) ;-)



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP