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

Langage Delphi Discussion :

Générique et contrainte de class, Delphi 2010


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut Générique et contrainte de class, Delphi 2010
    J'ai une petite curiosité à vous soumettre, en [DELPHI 2010]

    Soit une classe TFoo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TFoo = class  
      public
         constructor Create ; virtual ;
         procedure DoSomethingUsefull ;
    end ;
    Soit une classe TSubFoo dérivée de la précédente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TSubFoo = class(TFoo)
      public
         constructor Create ; override ;
    end ;
    Soit une classe générique, avec une contrainte de type, le type générique doit être issu de TFoo, bien évidemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TMyList<T:TFoo,constructor> = class
       public
          constructor Create ;
          procedure DoSomethingWithFoo(aT : T) ;
          function GetAFoo : T ;
    end ;
    Lorsque je compile le code comprenant ces trois classes, j'obtiens une erreur de compatibilité de type entre TFoo et TSubFoo.
    Ou si vous préférez la contrainte de type semble ne pas fonctionner.
    Par contre, si on enlève la contrainte de type, aucune difficulté, mais bien évidemment, dans ce cas, pourquoi s'ennuyer avec la contrainte de type dans la documentation de Delphi 2010 ?

    Si vous avez une idée, cela pourrait m'aider. J'ai contourné dans mon projet en cours, mais c'est toujours désagréable, sans compter que çà m'a pris du temps ...

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    aucuns problèmes avec ce code :

    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
    type
      TFoo = class
      public
        constructor Create; virtual;
        procedure DoSomething;
      end;
     
      TSubFoo = class(TFoo)
      public
        constructor Create; override;
      end;
     
      TMyList<T: TFoo, constructor> = class
      public
        constructor Create;
        procedure DoSomething(aFoo : T);
        function GetFoo: T;
      end;
     
      TFooList = TMyList<TFoo>;
      TSubFooList = TMyList<TSubFoo>;

    reste à voir l'implementation complete qui peu poser probleme


    attention "at" est un mots réservé.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    +1 à Dr Who, j'ai été un peu rapide là-dessus, sans doute par frustration.

    Le message d'erreur exacte était à la compilation du code qui posait problème :
    E2010: Types incompatibles : TOMChannel et TChannel (Delphi)

    Alors que bien entendu c'était déclaré TChannel=class(TOMChannel).

    Dans la pratique, j'ai contourné et simplifié, et obtenu le résultat recherché.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/07/2008, 13h49
  2. Réponses: 5
    Dernier message: 15/05/2008, 22h19
  3. Réponses: 5
    Dernier message: 27/10/2006, 15h34

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