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 :

Problème de déclaration de classe


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut Problème de déclaration de classe
    Bonjour!

    Je travaille à créer une classe un peu spéciale... Voilà ma déclaration (ne compile pas mais ça vous donne une idée de ce que je veux faire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public abstract class MachineNetwork<T:Machine> : IList<T>{
        private List<T> innerList = new List<T>();
        ...
        bool Add(T machine){
            if(AllowAdd(machine))
                innerList.Add(machine);
        }
        ...
     
        protected abstract bool AllowAdd(T machine);
    }
    Donc l'idée c'est de s'assurer que T est ou dérive de la classe Machine. Bien entendu, il serait simple d'effectuer cette vérification dans le constructeur et de lever une exception si nécessaire. Toutefois, le compilateur ne pourrait pas détecter l'erreur. Y a-t-il une façon particulière de déclarer cela?

    Merci!!

  2. #2
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut
    Laissez tomber, apparemment, .NET ne permet pas cela:

    Citation Envoyé par MSDN
    Generic classes are invariant. In other words, if an input parameter specifies a List<BaseClass>, you will get a compile-time error if you attempt to provide a List<DerivedClass>.
    Pour ceux ayant le même problème, voici ma solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public abstract class MachineNetwork<T>{
    ...
        public MachineNetwork(){
            if ( !typeof( T ).IsSubclassOf( typeof( Machine ) ) )
                throw new ArgumentException( "T doit être de type 'Machine'." );
        }
    ...
    }
    Merci quand même si certains ont pris du temps pour chercher!

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract class MachineNetwork<T> : IList<T> where T : Machine
    Ça marche pour Machine et tous ses dérivés, et c'est le compilo qui détectera les erreurs.

    Ta citation de MSDN est pour les passages de paramètres. Pas pareil.

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    En français, cela s'appelle de la contrainte sur les paramètres de type.

    On en parle ici: http://www.developpez.net/forums/sho...d.php?t=377701
    avec un lien vers là: http://msdn2.microsoft.com/fr-fr/lib...70(VS.80).aspx


    A+

    Edit: Hum.. j'adore la traduction
    où T : classe

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par Thomas Lebrun
    Edit: Hum.. j'adore la traduction
    où T : classe
    :P
    Bah, ça fera des posts en plus ici pour ceux qui ne savent pas lire l'anglais :)

    (mort aux VF)

  6. #6
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut
    Citation Envoyé par Maniak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract class MachineNetwork<T> : IList<T> where T : Machine
    Mmm très intéressant, je n'avais jamais employé le mot clé 'where' jusqu'à maintenant. Merci à tous!

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

Discussions similaires

  1. Inclusion de classes / problème de déclaration
    Par scal-80 dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2006, 16h28
  2. Réponses: 2
    Dernier message: 27/05/2006, 12h13
  3. Réponses: 5
    Dernier message: 10/11/2004, 19h44
  4. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17
  5. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17

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