IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

methode d'un objet générant le meme objet


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut methode d'un objet générant le meme objet
    Salut!
    J'ai une classe abstraite "Element" qui se dérive en classe "Cube","Sphere" etc....
    Ma classe "Element" implémente une méthode Duplicate() qui renvoi un Element de meme type que celui par lequel elle est appelée.
    Le probleme est :"comment dire à la methode Duplicate() le type d'element auquelle elle appliquée?"
    Est ce que je dois forcément surcharger cette méthode dans les classes filles, sachant qu'il n'y a pas différence dans l'algorithme de duplication?
    Merci!

  2. #2
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    abstract class Element
    {
    	abstract Element Duplicate();
    }
    class Cube : Element
    {
    	Cube() {
    		//...
    	}
     
    	Element Duplicate() {
    		//...
    		Element e = new Cube();
    		//...
    		return e;
    	}
    }
    Ca va fonctionner sans souci, puisqu'un Cube est un Element, donc lors de la duplication, tu lui dis que c'est une classe Cube lors de l'instanciation, mais tu stockes ton objet dupliqué dans une variable de type Element.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    D'abord une petite chose, en .net il y a un pattern pour faire ce que tu fais, c'est d'implémenter l'interface ICloneable.

    Ensuite dans ta classe de base tu peux utiliser la fonction MemberwiseClone qui permet de cloner un objet de manière polymorphique. Le problème c'est que tu vas renvoyer depuis la classe de base un type object (ou au mieux un type Element) et pas le type dérivé (même si en vrai le type de l'élément est bien une des classes dérivées).

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    abstract class Element : ICloneable
    {
       public object Clone()
       {	
          return MemberwiseClone();
       }
    }
    Attention MemberwiseClone ne fait qu'une copie superficielle des objets, c'est à dire qu'elle ne duplique pas les objets de type référence. Donc si tes objets n'ont comme membre que des variables de type valeur, tu n'es pas obligé de surcharger la méthode Clone dans les classes dérivées.

    J'espère que je suis clair

  4. #4
    Membre éprouvé Avatar de raOOn
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Par défaut
    ouep comme la sous-entendu Sphax, si biensur cela t'interesse, il existe un design pattern reconnu par le GoF : Prototype de type Creational

    je te conseille vivement de regarder ce design pattern qui est pas mal utilisé.

    Attention les designs patterns doivent etre utilisés à bon escient et quand ceux-ci répondent au probleme posé !

    site tres bien fait: www.dofactory.com

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut
    Merci pour vos réponses!
    Sphax: Apparement il y'a deux moyens de cloner avec IClonable: DeepCopy (en clonant les membres) et Shallow Copy (sans clonage interne). Donc si j'opte pour un clonage "deep", je devrais me retrouver avec un objet totalement nouveau, et pas seulement une nouvelle référence sur le même objet, c'est bien ça?
    Ma question est: Est-ce que ça n'alourdit pas le programme de faire dériver ma classe Element d'Iclonable, sachant que la fonction de copie n'est utilisée que rarement...?
    Je m'y connais pas du tout en interface, car je débute en C#, mais je vais quand meme tenter de l'implémenter.
    Sinon une autre question toujours autour de ce sujet.
    J'ai créé une collection public
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public List<Element> ListElements=new List<Element>();
    et j'ajoute des élements par la suite de cette façon (Ca à l'air de marcher):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        elem = new FormeCube(scene_, ListElements.Count);
                        ListElements.Add(elem);
    avec Element qui est une classe abstraite dont dérive les Classe Cube, Sphere...
    Est-ce que je peux utiliser les méthodes contenues dans les classe dérivées sur les objets de ma collection, bien que celle-ci soit créé pour des objets de type Element? Je veux dire, au final, est-ce que ma liste contient des Elements ou des Cubes, Sphere etc...
    Et si oui, comment je peux récuper le type de chacun des Elements de la collection, une fois qu'ils ont été ajoutés?
    Merci!!

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Apparement il y'a deux moyens de cloner avec IClonable: DeepCopy (en clonant les membres) et Shallow Copy (sans clonage interne). Donc si j'opte pour un clonage "deep", je devrais me retrouver avec un objet totalement nouveau, et pas seulement une nouvelle référence sur le même objet, c'est bien ça?
    Dans les deux cas, Shallow copy et Deep copy, tu dois te retrouver à la fin avec une référence sur un nouvelle objet. La différence se situe sur les références des objets membres. Avec une Shallow copy, les membres de types référence ne sont pas dupliqués, tu te retrouve avec deux objets qui en interne pointent sur les mêmes membres. Avec une Deep copy, les objets membres sont eux-même clonés. Dans les deux cas les membres de type valeur (les structures, les entiers, flottants etc...) sont dupliqués.

    La fonction MemberwiseClone effectue pour toi une shallow copy. Et si tes objets ne contiennent que des types valeur, ce que j'ai voulu dire plus haut c'est que dans ce cas une shallow copy est équivalente à une deep copy.

    Ma question est: Est-ce que ça n'alourdit pas le programme de faire dériver ma classe Element d'Iclonable, sachant que la fonction de copie n'est utilisée que rarement...?
    Non ça n'alourdit pas ta classe.

    Est-ce que je peux utiliser les méthodes contenues dans les classe dérivées sur les objets de ma collection, bien que celle-ci soit créé pour des objets de type Element? Je veux dire, au final, est-ce que ma liste contient des Elements ou des Cubes, Sphere etc...
    Et si oui, comment je peux récuper le type de chacun des Elements de la collection, une fois qu'ils ont été ajoutés?
    Ce qui se retrouve dans ta liste ce sont des références vers tes objets concrets de type Cube ou Sphere. Par contre tu utilises pour les pointer des variables du type de la classe de base. Donc naturellement tu peux utiliser les méthodes de la classe de base sur ces objets, pour accéder aux méthodes du type concret va falloir caster. Pour récupérer le type d'un objet en C# tu as le mot clée "is", voilà un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    List<Element> MaList;
    foreach(Element Elem in MaList)
    {
       if(Elem is Sphere)
       {
          Sphere MaSphere = (Sphere)Elem; //ici tu cast pour récupérer une référence du bon type
          //là tu peux utiliser MaSphere comme un objet de type Sphere
       }
    }
    EDIT: un petit mot en plus qd même. Le "if(Elem is Sphere)" est en général à éviter car à partir de là ton code n'est pas extensible facilement. Si tu crées un nouveau type d'objet, genre Losange, il faudra gérer le cas un peu partout. La méthode préférée est de passer par une interface qui contiendra tte les méthodes communes à tes objets de manière à pouvoir les traiter tous de la même façon. C'est ce que tu fais avec ta classe de base Elem.
    Tu ne peux pas ajouter des méthodes à cette classe pour résoudre ton problème ? Tu veux faire quoi exactement dans ce if ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Par défaut
    up!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] même objet pour plusieurs servlets
    Par Vrylx dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 15/06/2006, 17h31
  2. Réponses: 3
    Dernier message: 09/04/2006, 02h02
  3. Réponses: 2
    Dernier message: 15/03/2006, 18h48
  4. [POO] Conflit avec objet ayant le meme name
    Par ozzmax dans le forum Langage
    Réponses: 7
    Dernier message: 11/01/2006, 17h06
  5. Réponses: 11
    Dernier message: 16/10/2005, 20h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo