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 :

transtypage d'interface en classe


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 3
    Points
    3
    Par défaut transtypage d'interface en classe
    Voilà je cherche quelques explications précises du mécanisme d'interface sous delphi. Et principalement sur l'effet d'un transtypage d'interface en une classe implémentant cette interface.

    J'ai essayé de définir un système simple de 2 interfaces (interface1, interface2)
    interface1 possède une propriété du type interface2
    et interface2 possède une propriété du type interface1

    il y a deux classes abstraitres (classe1, classe2) implémentant cette structure et pour représenter les propriétés j'utilise un champ de classe implémentant les interfaces correspondant à celles typant les propriétés respectives.

    J'espère que je suis clair :-)

    Et bien si je crée un objet de classé héritant de classe2 et que j'initialise bien tout, et que je récupère via la propriété d'interface1 l'objet de classe1 et que je le transtype j'obtiens un objet qui pointe sur n'importe quoi ... mais le champs fournit la bon objet ???

    cela donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
    Essai: classe2;
    tmp: classe1;
    begin
    Essai := heriteclasse2.Create(...);
    tmp := classe1(Essai.ProprieteInterface1);
    tmp := Essai.ChampInterface1detypeclasse1;
    end.
    ... et bien la avtdernière ligne ne fournit rien de correct alors que la derniere bien

    j'ajoute que chaque classe herite de TInterfaceObject

    mon impression est que l'on ne peut pas transtyper une interface en une classe ... mais bon

    alors si qqn pouvais éclairer ma pauvre antenne :-)) ce serait bien cool[/code]

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut Re: transtypage d'interface en classe
    Citation Envoyé par T0ch
    mon impression est que l'on ne peut pas transtyper une interface en une classe ... mais bon
    C'est une bonne impression. Il n'est théoriquement pas possible de passer d'une interface à une coclasse. Il faut rester au niveau des interfaces. Si vraiment tu ne peux pas faire autrement, tu peux toujours ajouter une méthode à ton interface, celle-ci retournant l'adresse de l'instance de la coclasse. Le transtypage fonctionnera dans ce cas là.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Ok, merci. :-))

    encore une dernière petite question avec la gestion de référence des interfaces. Je ne comprends pas pourquoi il faut référencer le nombre d'instance d'interface ? Et ceci m'amène à me poser de comment fonctionne véritablement les interfaces. Pourquoi cela ne fonctionne-t-il pas comme une classe abstraite pure (qui a priori remplit la même fonction) ? Je cherche depuis quelque temps une bonne explication à ce propos et je ne trouve, donc si quelqu'un pouvait à nouveau m'éclairer ou me rediriger vers des références bouquins ou électroniques ce serait super.

  4. #4
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    C'est le "problème" des interfaces Delphi. Les interfaces Delphi sont des interfaces COM (elles dérivent toutes de IUnknown). Cela les oblige à utiliser le mécanisme de comptage de référence de COM. C'est très pratique mais il faut un petit moment avant de bien en maîtriser les tenants et les aboutissants.
    Il est toujours possible de créer ses propres coclasses implémentant AddRef et ReleaseRef pour bypasser le mécanisme de comptage.
    Jette un oeil à http://delphi.developpez.com/cours/ pour y trouver quelques articles traitant des objets COM.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    merci beaucoup pierre, ... :-D

    j'ai en effet trouvé un bon article sur les interfaces parlant du COM, et j'ai compris pourquoi on ne pouvait pas recaster une interface par sa coclasse

    puisque le variable de type interface ne pointe que sur une partie de la zone mémoire de la coclasse, celle qui implémente les signatures déclarées dans l'interface (dis moi si je me trompe)

    ce qui m'amène à peut être une solution à mon problème (cad celle que tu m'as proposé dans ton premier post et dont je ne comprenais pas alors vraiment l'intérêt) : écrire une méthode qui renvoie Self typé selon la classe de base que j'utilise ou carrément pour être le plus générique de classe TObject

    ais-je bien compris ?

  6. #6
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Oui, tu as bien saisi le principe. Par contre, si tu veux être COM compliant, tu ne pourras pas retourner d'objet Delphi (je parle du type) mais seulement un pointeur puisque en théorie, les types classe de Delphi n'existent pas en COM. Ceci dit, si tu n'as pas l'intention d'utiliser tes coclasses ailleurs qu'en Delphi et que tu ne crées pas de bibliothèque de type, cela ne devrait pas poser problème.

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

Discussions similaires

  1. Heritage et Interface de classe
    Par Seth77 dans le forum C#
    Réponses: 10
    Dernier message: 16/02/2007, 12h17
  2. [POO] Différence entre Interface et classe Abstraite
    Par viviboss dans le forum Langage
    Réponses: 7
    Dernier message: 29/11/2006, 16h39
  3. Interface ou classe abstraite ?
    Par Premium dans le forum Langage
    Réponses: 8
    Dernier message: 21/02/2006, 10h23
  4. Interface et classe
    Par Ryadus dans le forum Langage
    Réponses: 6
    Dernier message: 30/01/2006, 11h11

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