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 :

Interface et List<InterfaceDetail>


Sujet :

C#

  1. #1
    Membre régulier

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Points : 81
    Points
    81
    Par défaut Interface et List<InterfaceDetail>
    Bonjour à tous,

    J'ai une petite question concernant les interfaces.

    J'ai deux interfaces IFacture et IFactureDetail qui représentent des classes d'entités.

    Deux classes implémentent IFacture, Facture et FactureUI, deux autres classes implémentent IFactureDetail, FactureDetail et FactureDetailUI.

    Mes classes Facture et FactureUI doivent respectivement posséder des membres de List de leur détail.

    Comment faire pour que Facture et FactureUI respectent bien leur contrat d'interface qui contient une List<IFactureDetail> ?

    Merci

    Axel
    Mon entreprise recrute des développeurs C#, n'hésitez pas à me contacter par MP

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Comment faire pour que Facture et FactureUI respectent bien leur contrat d'interface qui contient une List<IFactureDetail> ?
    Bah tu déclares cette propriété dans la classe, comme pour les autres membres d'interface... je comprends pas trop ton problème, il faudrait que tu expliques plus clairement ce qui te gène.

  3. #3
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Je pense qu'il cherche à s'assurer que les classes qui implémentent son interface implémentent également des membres List.

    Je crois pas que ce soit possible avec une interface, il te faudrait une classe mère abstraite implémentant l'interface et la List que tu souhaites. Il faut ensuite faire dériver tes classes de cette classe mère.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  4. #4
    Membre régulier

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Points : 81
    Points
    81
    Par défaut
    Clairement je souhaite que Facture et FactureUI implémentent IFacture, sans leur passer List<IFacture> mais bel et bien leur liste respective.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public interface IFacture
    {
    //Membres de l'interface
     
    List<IFactureDetail> Detail {get;set;}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Facture : IFacture
    {
    //Membres de la classe
     
     
    private List<FactureDetail> _Detail;
    public List<FactureDetail> Detail 
    {
    get{return _Detail;}
    set{_Detail = value;}
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class FactureUI : IFacture
    {
    //Membres de la classe
     
     
    private List<FactureDetailUI> _Detail;
    public List<FactureDetailUI> Detail 
    {
    get{return _Detail;}
    set{_Detail=value;}
    }
    }
    Je suis plus clair?
    Mon entreprise recrute des développeurs C#, n'hésitez pas à me contacter par MP

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    A moins que tu utilises des génériques, ceci n'est pas possible pour la simple et bonne raison qu'une List<FactureDetail> n'est pas une List<IFactureDetail> (être au sens de l'héritage en poo).

    Tu peux donc avec les génériques avoir un truc comme ca:
    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
    public interface IFactureDetail
    {}
     
    public interface IFacture<TDetail> where TDetail : IFactureDetail
    {
    	List<TDetail> Detail {get;set;}
    }
     
    public class FactureDetail : IFactureDetail
    {}
     
    public class Facture : IFacture<FactureDetail>
    {
    	private List<FactureDetail> _Detail;
    	public List<FactureDetail> Detail 
    	{
    		get{return _Detail;}
    		set{_Detail = value;}
    	}
    }

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    A moins que tu utilises des génériques, ceci n'est pas possible pour la simple et bonne raison qu'une List<FactureDetail> n'est pas une List<IFactureDetail> (être au sens de l'héritage en poo).
    De mémoire ça devrait être possible avec une implémentation explicite de l'interface, non ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    De mémoire ça devrait être possible avec une implémentation explicite de l'interface, non ?
    A priori c'est la voie à suivre...
    http://msdn.microsoft.com/fr-fr/library/ms173157.aspx

    Mais dans ce cas précis je ne vois pas trop comment ça va marcher... Tu peux faire un truc comme ç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
    public class Facture : IFacture
    {
            // Implémentation explicite
            List<IFactureDetail> IFacture.Detail
            {
                get { return _Detail.ToList<IFactureDetail>(); }
                set { _Detail = value.Cast<FactureDetail>().ToList(); }
            }
     
    	private List<FactureDetail> _Detail;
    	public List<FactureDetail> Detail 
    	{
    		get{return _Detail;}
    		set{_Detail = value;}
    	}
    }
    Mais :
    1. c'est pas terrible parce que ça fait une copie de la liste à chaque fois
    2. pour le set c'est un peu foireux, parce que rien ne garantit qu'une List<IFactureDetail> ne contient que des FactureDetail. Enfin on peut le supposer, mais ce ne sera pas vérifié statiquement par le compilateur...

    La question qui se pose, c'est pourquoi as-tu besoin que Detail soit de type List<FactureDetail> plutôt que List<IFactureDetail> ? C'est un peu plus pratique dans certains cas, mais vu les problèmes que ça pose, je ne suis pas sûr que ça vaille la peine. Tu peux toujours faire un cast vers FactureDetail dans les cas où tu as besoin d'un truc spécifique à FactureDetail qui n'est pas défini dans l'interface.

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par tomlev Voir le message
    2. pour le set c'est un peu foireux, parce que rien ne garantit qu'une List<IFactureDetail> ne contient que des FactureDetail. Enfin on peut le supposer, mais ce ne sera pas vérifié statiquement par le compilateur...
    .OfType<FactureDetail>() sinon

    Mais j'avoue que c'est pas top

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    .OfType<FactureDetail>() sinon
    Ouais mais ça a pas le même sens...

  10. #10
    Membre régulier

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 37
    Points : 81
    Points
    81
    Par défaut
    Bon du coup je suis parti sur les génériques.

    Merci bien
    Mon entreprise recrute des développeurs C#, n'hésitez pas à me contacter par MP

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    A vrai dire je ne vois pas en quoi la solution avec les génériques résout quoi que ce soit...

    Facture implémente IFacture<FactureDetail>, alors que FactureUI implémente IFacture<FactureDetailUI>. Donc Facture et FactureUI implémentent 2 interfaces différentes, ce qui fait qu'elles n'ont plus rien en commun... Alors que le but au départ était qu'elles implémentent la même interface.

    (au fait, j'ai corrigé le code dans mon message un peu plus haut : dans mon exemple Facture implémente IFacture, pas IFacture<FactureDetail>)

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

Discussions similaires

  1. Problème d'interface et List<>
    Par Ishizaki dans le forum ASP.NET
    Réponses: 1
    Dernier message: 29/04/2008, 14h19
  2. Interface en zone de liste
    Par Kihmé Xs dans le forum IHM
    Réponses: 4
    Dernier message: 12/06/2007, 10h18
  3. implementer interface list en généric
    Par goldorax113 dans le forum Langage
    Réponses: 9
    Dernier message: 16/10/2006, 12h47
  4. Liste des implémentations d'une interface
    Par YokoSop dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2006, 23h37
  5. [Interface Homme Machine] Liste des interactions possibles
    Par dymezac dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 27/01/2006, 11h45

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