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 :

Les limites de l'implements ?


Sujet :

Langage Delphi

  1. #41
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    oui enfin mon idée était que cela permet de ne pas instancier la version 1 tant qu'on en a pas besoin et DirectX présente régulièrement des interface qui n'ont plus rien à voir avec celle de la version précédente

    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
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    type
     IVersion1=interface
      ['{C04A6AE1-8F31-4893-A255-79E49AAFDFE9}']
      procedure SayHello;
     end;
     
     IVersion2=interface
      procedure SayHello;
     end;
     
     TVersion1=class(TInterfacedObject,IVersion1)
      procedure SayHello;
      destructor Destroy; override;
     end;
     
     TVersion2=class(TInterfacedObject,IVersion1,IVersion2)
     private
      function GetVersion1:IVersion1;
     public
      destructor Destroy; override;
      procedure SayHello;
      property Version1:IVersion1 read GetVersion1 implements IVersion1;
     end;
     
     
    destructor TVersion1.Destroy;
    begin
     ShowMessage(ClassName+' say good bye');
     inherited;
    end;
     
    procedure TVersion1.SayHello;
    begin
     ShowMessage(ClassName+' say hello');
    end;
     
    destructor TVersion2.Destroy;
    begin
     ShowMessage(ClassName+' say good bye');
     inherited;
    end;
     
    function TVersion2.GetVersion1:IVersion1;
    begin
     ShowMessage('New Version1');
     Result:=TVersion1.Create;
    end;
     
    procedure TVersion2.SayHello;
    begin
     ShowMessage(ClassName+' say hello');
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
     v2:IVersion2;
     v1:IVersion1;
    begin
     v2:=TVersion2.Create;
     v2.SayHello;
     v2.QueryInterface(IVersion1,v1);
     v1.SayHello;
    end;
    par contre, avec ce code on retombe sur une fuite mémoire si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
     v1:=TVersion2.Create;
     v1.SayHello;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  2. #42
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    en scannant les sources de mon disque dur j'ai trouvé un seul exemple d'utilisation d'implements, mais il est intéressant, car il m'a fait apparaitre un aspect d'implements auquel je n'avais pas pensé :

    l'exemple d'utilisation est jclSchedule.pas de la JCL (dans common)
    où sont implementées dans une classe TSchedule différentes interfaces
    qui ont en commun certaines propriétés et noms de procédure.

    les interfaces implémentées dans TSchedule sont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        property DailyFreq: TDailyFreq read FDailyFreq implements IJclScheduleDayFrequency;
        property DailySchedule: TDailySchedule read FDailySchedule implements IJclDailySchedule;
        property WeeklySchedule: TWeeklySchedule read FWeeklySchedule implements IJclWeeklySchedule;
        property MonthlySchedule: TMonthlySchedule read FMonthlySchedule implements IJclMonthlySchedule;
        property YearlySchedule: TYearlySchedule read FYearlySchedule implements IJclYearlySchedule;

    et chacune des interfaces implémentées possède une propriété Interval

    quand j'essaye d'imaginer cette classe sans les implements
    dans ce cas apparement implementer toutes ces interfaces directement dans la classe TSchedule aurait compliqué l'écriture de la propriété Interval dans TSchedule (elle est alors nécessaire pour implementer le contrat des interfaces)

    et l'accesseur GetInterval, qui aurait du alors contenir un "case" et une implémentation différente en fonction de l'aspect monthly, daily ou weekly .. du TSchedule
    n'aurait servi à rien d'autre qu'a remplir les contrats d'interface de TSchedule
    car Interval n'est de toute manière utilisée dans la classe en interne que directement via les objets objets contenus : MonthlySchedule, DailySchedule, WeeklySchedule

    Dans ce cas, aussi, avec implements, l'interet est aussi que TSchedule peut switcher directement et automatiquement vers la bonne classe d'implémentation en fonction de l'interface utilisée...

    ...donc avec cet aspect ca rejoint effectivement dans un sens l'exemple des versions de directX : implementer différents concepts similaires dans une classe (mais ayant une implémentation différente)
    afin de pouvoir switcher de l'un à l'autre en fonction de l'interface utilisée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TVersionManager = class(TInterfacedObject,IVersion1,IVersion2,IVersion3)
      //.... 
      property Version1:IVersion1 read GetVersion1 implements IVersion1;
      property Version2:IVersion2 read GetVersion2 implements IVersion2;
      property Version3:IVersion2 read GetVersion3 implements IVersion3;
      //...
    end;

    finalement, IJclDailySchedule, IJclWeeklySchedule, IJclMonthlySchedule...
    sont elles aussi différentes versions d'une même mécanique de base.

  3. #43
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 51
    Points
    51
    Par défaut
    je vais essayer de créer mon TAggregatableObject avec implements !

    je n'y avait pas pensé mais ça m'a l'air d'être un cas tout indiqué...
    après tout TInterfacedObject et TAggregatedObject sont 2 versions d'une même mécanique qui met en oeuvre le ref counting et queryinterface..

  4. #44
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Dans ce Tschedule, effectivement la property en commun pourrait justifier l'usage d'implements. mais je ne vois que ca personnellement.
    Akim Merabet

Discussions similaires

  1. [Algorithmes génétiques] Limites ?
    Par laclac dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 21/03/2006, 10h46
  2. Les limites de wget
    Par djibril dans le forum Applications et environnements graphiques
    Réponses: 10
    Dernier message: 23/02/2006, 11h20
  3. Les limites d'ext3
    Par GLDavid dans le forum Administration système
    Réponses: 5
    Dernier message: 05/12/2005, 11h32
  4. Réponses: 2
    Dernier message: 13/10/2005, 19h04
  5. Quelles sont les limites de INTERBASE 7.5 ?
    Par lio33 dans le forum InterBase
    Réponses: 1
    Dernier message: 21/07/2005, 12h54

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