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] contrainte de type generique et polymorphisme


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut [interface] contrainte de type generique et polymorphisme
    Hello à tous,

    je suis face à un truc que je comprend pas :

    J'ai une classe mère abstraite et deux classes filles qui possèdent les deux une collection generique dont le type possède une contrainte. La classe mère comprend egalement une methode abstraite de creation de cette collection. Ce sont les classes filles qui implementent la construction de la collection generique.

    la classe mère avec son constructeur protegé et la definition de la methode
    de creation de la coll. générique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public abstract class CSide : ISide
    {
           protected CSide()
           {
                this.CreateLink();        
           }
           protected abstract void CreateLink();
    }
    les classes filles (leur seules differences est le type de la collection generique.
    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 CLeft : CSide , ILeft
    {
        public ILink<ILeft> Link { get; private set; }
        public CLeft() : base(){}
        protected override void CreateLink()
        {
            Link = new CLink<ILeft>();
        }  
    }
     
    public class CRight: CSide , IRight
    {
        public ILink<IRight> Link { get; private set; }
        public CRight() : base(){}
        protected override void CreateLink()
        {
            Link = new CLink<IRight>();
        }  
    }
    {
    et enfin le type de la collection generique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class CLink<T> : ILink<T> where T: ISide
    {   
        private readonly HashSet<T> m_Connectors;
     
        public CLink()      
        {
            m_Connectors = new HashSet<T>();            
        } 
    }

    Toute cette petite machinerie fonctionnait parfaitement avant que je extrait la contrainte de CLink dans ILink. Depuis cette instant, j ai une erreur :
    Test method VerifyFunctionTest threw exception: System.TypeLoadException: GenericArguments[0], T, pour ILink`1[T]' ne respecte pas la contrainte du paramètre de type T..
    L'interface qui posse problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface ILink<T> : ILink where T: ISide
    {    
        ICollection<T> Connectors { get; }    
    }
    Et au debug, plus moyen d'entrée dans les fonctions "CreateLink()" de creation implmenté dans les classes filles (polymorphisme). J' ai verifié, le type de l'objet est bien un de type fille.
    Si je laisse la contrainte uniquequement sur la classe et par sur l'interface, tout marche correctement.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Par défaut
    Il me semble que les contraintes doivent être explicitement indiqué sur les classes dérivées.

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class CollBase<T> where T : IComparable
      {
      }
     
      class Coll<T> : CollBase<T>
      {
      }
    ne compile pas à moins de repréciser where T : IComparable sur la classe héritée

    Tu ne dois donc pas avoir le choix : il doit falloir remettre la contrainte where T: ISide sur Clink<T> même si elle est précisée sur ILink<T>

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut


    j ai trouvée l'erreur qui étais en fait un problème qui a rien avoir avec ce que j ai decris ci dessus. (mon projet de test utilisait une vielle reference).

    Pour répondre à karlus, il n'y a pas besoin de repeter les contraintes sur les clases derivée. ;-)

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut
    Merci beaucoup j'ai rencontré le même soucie

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

Discussions similaires

  1. contrainte de type logique sur un champ
    Par zegin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 29/11/2007, 18h37
  2. Comment faire une interface de ce type....
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/04/2007, 13h50
  3. [Sql] contrainte sur type date
    Par zchallal dans le forum Oracle
    Réponses: 2
    Dernier message: 19/06/2006, 13h57
  4. Réponses: 9
    Dernier message: 01/12/2005, 10h54
  5. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 09h51

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