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

ASP.NET Discussion :

[2.0][C#] Héritage - Copie du père dans le fils


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut [2.0][C#] Héritage - Copie du père dans le fils
    Bonjour,

    Je rencontre un petit problème avec l'utilisation de l'héritage en C# et les cours sur l'héritage sont très loin, je ne trouve pas mon bonheur sur le net et je trouve mon problème illogique.


    J'ai une classe classeA, et une classe classeB.
    classeB hérite de classeA (donc classeB contient autant ou plus d'infos que classeA).

    Je souhaite pouvoir copier classeA dans classeB (c'est pour la construction des éléments, le père fait la base et chaque type de fils rempli ses données propres).

    Mais je ne comprends pas comment faire ...
    Je n'ai pas le droit à B = (classeB) A puisque A n'est pas du tout classeB.

    Mais je ne peux pas faire non plus :
    (classeA) B = A

    Et je ne comprends pas trop pourquoi ...

    Quelqu'un aurait une petite idée pour m'avancer un peu ?
    Je pense que ca doit etre possible quand meme ...

    Désolé si vous n'avez rien compris a mon post.
    Merci beaucoup
    Worldofdada

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Par défaut
    Bonjour,
    Je pense qu'en surchargeant le constructeur du fils (avec comme argument le pere) tu devrais y arriver car le fils à toutes les propriétés du pere.
    Par exemple
    si tu as une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    classe point (float x float y)
    tu as les pripriétées :
    - float abscisse
    - float ordonnée
    et une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cercle : point 
    qui a en plus la propriété 
    -float rayon
    tu peux avoir un constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cercle(Point p)
    {
    this.abscisse = p.abscisse;
    this.ordonnée = p.ordonnée;
    this.rayon = 0;
    }
    et la tu recupere bien les données du père.
    C'est bien évidement un exemple simple. Mais je pense qu'il illustre assez bien ce que tu cherches
    Si ca ne répond pas à ta question n'hésites pas

    Bonne journée
    Notalp

  3. #3
    Membre éclairé Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Par défaut
    Copier classeA dans classeB. Tu veux dire, créer une nouvelle instance de classeB, qui contient les données d'une autre instance de classeA?
    Ou tu veux seulement que quand tu crées une nouvelle instance de classe B, les données de classeA soient initialisées en même temps?

    Dans le premier cas, j'aurais suggéré de créer une méthode, appelée par exemple CopierDans(classeA pObj), qui copie ses données dans une autre instance, comme montré dans le post précédent.

    Dans le deuxième cas, tu es en train de chercher autour des constructeurs. Le constructeur des classes-mères est automatiquement appelé dans les cas simples des constructeurs par défaut, mais le plus souvent on a besoin de le faire explicitement:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public classeA (Object donn1, Object donn2) {
        this.donn1=donn1;
        this.donn2=donn2
    }
    public classeB (Object data1, Object data2, Object data3, Object data4) : base (data1, data2) {
        this.data3=data3;
        this.data4=data4;
    }
    N'hésite pas à préciser ta question si je n'y ai pas tout à fait répondu.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut
    Ok donc si je comprends bien, il faut que je crée une méthode de "copie".

    Je m'étais gardé cette solution de coté car j'ai beaucoup d'attributs dans ma classe principale, et je pensais qu'il existait un mécanisme pour "caster" un objet de type pere, dans un objet de type "fils".

    Merci pour vos réponses, je suis prenneur si y'a d'autres solutions

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Par défaut
    En revanche, pour ne pas garder des questions idéfiniment ouvertes, si tu considère avoir eu réponse a ta question, merci d'utiliser pour nous le signaler
    Merci et bonne journee

    Notalp

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut
    Oui, comme d'habitude

    C'est juste que j'attendais au cas où quelqu'un ai une solution miracle ... on peut espérer en période de fêtes

  7. #7
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Pensez à utiliser la réflection pour faire une fonction qui copie automatiquement les fieds et les properties d'un classe vers un autre...

    1) C'est réutilisable
    2) Ca apprend pas mal de choses point de vue réflection

  8. #8
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Je suis assez nouveau en .Net mais la lecture de ce post me fait néanmoins poser des questions :
    - Pensez vous réellement qu'une copie est la solution? A quoi bon effectuer du développement objet dans ce cas?
    - Le type de copie que l'on propose est il bien ce que l'on appelle l'aggrégation en c++ ? ou bien via la réflexion s'agit il de copier l'ensemble des éléments de la classe 1 par 1?

    A mon avis tu peux avoir une classe Noeud ainsi :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    	public class Noeud
    	{
    		protected string m_nom;
    		protected string m_level;
    		protected bool m_isRoot;
     
    		public string MyName 
    		{
    			get {return m_nom;}
    			set { m_nom = value;}
    		}
     
    		//constructeur du noeud
    		public Noeud(string Nom, string Level)
    		{
    			m_nom = Nom;
    			m_level = Level;
    			m_isRoot = true;
    		}
     
    		//constructeur sns argument : 
    		public Noeud() 
    		{
    			m_nom = m_level = "N/A";
    			m_isRoot = true;
    		}
    	}
    une classe noeudFils qui hérite de son père ainsi :

    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
    18
    19
    20
    21
    public class NoeudFils:Noeud
    	{
     
    		string m_dataSupplementaire;
    		//
    		// TODO : ajoutez ici la logique du constructeur
    		//
    		public NoeudFils(string Nom, string Level, string DataSupp):base(Nom,Level)
    		{
    			this.m_isRoot  = false;
    			m_dataSupplementaire = DataSupp;
     
     
    		}
     
     
    		public NoeudFils():base()
    		{
    			m_dataSupplementaire = "N/A";
    		}
    	}
    Et tu devrais pouvoir accéder sans problème à des propriétés pour lesquels tu as créés les bons accesseurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			NoeudFils n2 = new NoeudFils();
    //En castant comme dans ton exemple
    			textBox1.Text = ((Noeud)n2).MyName ;
     
    //Et même sans casting grace à l'héritage
    			textBox1.Text = n2.MyName ;
    Ais je bien compris le problème?
    Est ce que cela correspond à ta problématique ?

  9. #9
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Ce n'est pas ca le problème...
    Imagine qu'on te donne une classe noeud... mais toi tu veux une classe noedfils... on pourrait convertir l'un vers l'autre car le fonctionnement est le même, sauf que noed fils permet plus de choses... Très bien et je convertis comment le noed qu'on me donne en noed fils ?

  10. #10
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Bon merci FremyCompany, je comprends mieux le problème effectivement cela est moins trivial. Je pense que pour ma part, j'aurai rajouté un constructeur à NouedFils qui prennent en paramètre un Noueudpere...
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	public NoeudFils(Noeud n) 
    	{
    		this.m_nom = n.MyName ;
    		this.m_level = n.MyLevel ;
    	    this.m_isRoot  = false;
    	}
    Ce qui permet ensuite des appels de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    			Noeud n = new Noeud("unNom","unLevel");
    			NoeudFils nf = new NoeudFils(n);
    (Même si dans l'absolu si l'on se retouve dans cette situation il faudrait peut être remettre en question le reste de l'architecture )
    Enfin je suivrais tes conseils pour voir ce qu'il est possible de faire avec le mécanisme de réflexion.

    Ciao

  11. #11
    Membre Expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Par défaut
    Parfois l'architecture est en cause, mais parfois pas...
    En effet, il se peut que la classe noed aie été developpée en internet, de même que la classe noedfils. Dans ce cas, il aurait été plus judicieux de ne faire qu'une seule et meme classe avec une propriété "implementsNoedFils" qui dit si la classe est prête à être utilisée comme noedFils ou si un traitement (initNoedFils) doit lui être appliqué, mais si noed est une classe du frameWork, ce n'est pas possible...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/12/2005, 21h10
  2. Copie d'écran dans un fichier
    Par angsthase dans le forum Autres Logiciels
    Réponses: 12
    Dernier message: 17/08/2005, 00h45
  3. Problème de copie de string dans string
    Par kazarn dans le forum SL & STL
    Réponses: 17
    Dernier message: 15/03/2005, 18h35
  4. [easystruts] probleme de copie des *.tld dans web-inf
    Par champion dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/08/2004, 11h46
  5. Copie de donnees dans SQL server 2000
    Par papayou42 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/12/2003, 10h58

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