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

C# Discussion :

Petite question sur l'héritage


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut Petite question sur l'héritage
    Bonjour,

    J'ai une petite question au niveau de l'héritage.
    J'ai une classe mère BaseGUI
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public abstract class BaseGUI : INotifyPropertyChanged
    {
    	public event PropertyChangedEventHandler PropertyChanged;
     
     
    	public void RaisePropertyChanged(object sender, string elementName)
    	{
    		if(PropertyChanged!=null)
    			PropertyChanged(sender, new PropertyChangedEventArgs(elementName));
    	}
    }

    Je voudrais obliger les classes filles à implémenter deux méthodes.
    - FromEntity
    - ToEntity

    Le problème c'est que les types d'entréés et de sorties dépende de la classe fille.
    Du coup je ne sais pas comment déclarer mes méthodes dans BaseGUI

    Un exemple
    Code C# : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    public class UserGUI : BaseGUI
    {
    	...
    	...
     
    	public void FromEntity(UserEntity user){
    		...
    		...
    	}
     
    	public UserEntity ToEntity(){
    		...
    		...
    	}
    	}
     
    	public class SportGUI : BaseGUI
    	{
    	...
    	...
     
    	public void FromEntity(SportEntity sport){
    		...
    		...
    	}
     
    	public SportEntity ToEntity(){
    		...
    		...
    	}
    }
     
    public abstract class BaseGUI : INotifyPropertyChanged
    {
    	public event PropertyChangedEventHandler PropertyChanged;
     
    	public void RaisePropertyChanged(object sender, string elementName)
    	{
    		if(PropertyChanged!=null)
    			PropertyChanged(sender, new PropertyChangedEventArgs(elementName));
    	}
     
    	public abstract void FromEntity(?????);
    	public abstract ???? ToEntity();
    }

    Par avance merci.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Est ce que l'héritage ici est le meilleur choix pas sûre...

    Y a t il un point commun entre tes classes (E/S) ?
    Pour obliger les classes à avoir ces méthodes tu peux mettre des interfaces, ça répondrai à ton besoin ?

    Sinon y a aussi la solution générique qui peut être bien ici
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    l'approche dépend pas mal du code qui effectue les appels à FromEntity et ToEntity (ce code est-il lui-même dépendant d'une classe particulière)... et du fait qu'il y ait ou pas une classe de base pour tous tes Entity (autre qu'object).

    Sinon... tu castes. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void FromEntity( BaseEntity e )
    {
         if ( e is UserEntity )
         {
              UserEntity ue = (UserEntity)e;
              ...
         }
         else
          ...
    }

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    classe générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class mere<T1, T2> 
    {
      public abstract T2 mth1(T1 param1);  
    }
    méthode générique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class mere 
    {
      public abstract void mth<T>(T param1);  
    }
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    ... je crois que je vais demander à google !

    A mon sens, utiliser des génériques (quelle que soit la forme) va nécessiter autant de cas distincts pour le code qui appelle ses méthodes (from et to entity) : c'est pas forcément le but

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour les méthodes génériques, il n'y a rien à faire ca récupère ce qu'on passe
    pour les classes par contre il faut rajouter <un type> à chaque nommage de la classe ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    Je comprends bien ça, mais si l'appel de méthode ne comporte pas de variable du type souhaité (cas où l'appel utilise une classe de base) ça ne marche pas, il me semble (à moins de caster, mais lors de l'appel, cette fois).

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    Je n'en ai peut être pas suffisament dit tout à l'heure.
    C'est une application WPF multi couche (GUI/BLL/DAL/...)
    J'ai mes entités qui sont dans un projet référencé dans toutes les couches. Je les suffixe par "Entity" (ex: UserEntity).
    Dans ma couche GUI (Projet WPF), je transforme ces entités en entités GUI pour implémenter le support de INotifyPropertyChanged et de ObservableCollection
    Voici ce que ça donne niveau code
    Code c# : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    public class UserEntity
    {
    	public long Id { get; set; }
    	public string Lastname { get; set; }
    	public string Firstname { get; set; }
    }
     
    public class UserGUI : BaseGUI
    {
    	private long _Id;
    	public long Id
    	{
    		get { return _Id; }
    		set { _Id = value; RaisePropertyChanged(this, "Id"); }
    	}
     
    	private string _Lastname;
    	public string Lastname
    	{
    		get { return _Lastname; }
    		set { _Lastname = value; RaisePropertyChanged(this, "Lastname"); }
    	}
     
    	private string _Firstname;
    	public string Firstname
    	{
    		get { return _Firstname; }
    		set { _Firstname = value; RaisePropertyChanged(this, "Firstname"); }
    	}
     
    	public UserGUI()
    	{
    	}
     
    	public UserGUI(UserEntity entity)
    	{
    		FromEntity(entity);
    	}
     
    	public void FromEntity(UserEntity entity)
    	{
    		Id = entity.Id;
    		Lastname = entity.Lastname;
    		Firstname = entity.Firstname;
    	}
     
    	public UserEntity FromEntity()
    	{
    		return new UserEntity(){
    						Id = Id,
    						Lastname = Lastname,
    						Firstname = Firstname};
    	}
    }

    En fait j'hérite de BaseGUI pour ne pas avoir à reécrire la méthode RaisePropertyChanged à chaque fois.
    Mais je voudrais obliger mes entités GUI à définir la méthode FromEntity et ToEntity.
    Hors j'ai un problème pour la signature de la méthode (si je passe par une interface), car le type dépend de la classe fille.

Discussions similaires

  1. Petite question sur l'héritage
    Par Ydalb dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/07/2009, 17h08
  2. Petite question sur les héritages?
    Par razonback dans le forum C++
    Réponses: 4
    Dernier message: 15/02/2009, 15h13
  3. Réponses: 8
    Dernier message: 25/03/2008, 21h59
  4. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 00h48
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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