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

 Delphi Discussion :

Référence inter-classe ex ou implicite ?


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut Référence inter-classe ex ou implicite ?
    Hello,

    sujet un poil philosophique.

    si on a deux classes, chacune ayant en attributs un ou plusieurs pointeurs vers des objets de l'autre classe, est il préférable de définir ces attributs de type TObject puis de caster avec le type de classe partout dans le code de la classe où cela est nécessaire, ou bien est il préférable de définir ces attributs directement avec le type de la classe (et que dans une seule sinon on se retrouve avec le problème de la référence circulaire inter-unité, sauf à définir les deux classes dans la même unité) ?

    Je me pose la question d'un point de vue lourdeur de traitement pour le processeur, devant dans un cas caster à chaque fois, et pas dans l'autre...

    Je vais mettre en place le tout avec des références vers le type TObject car je trouve cela souple et trivial, mais vos avis de pros m'intéressent sur ce sujet !

    Merci.

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    On peut biaiser pour la référence circulaire normalement avec une déclaration du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TMaClasse1 = class;
     
    TMaClasse2 = class(TObject)
    private
    FMonObjet: TMaclasse1;
    et définir TMaClasse1 dans un autre fichier et la mettre dans les uses de l'implémentation.

  3. #3
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Non, tu ne peux pas faire ça si TMaClasse1 n'est pas complètement définie dans la même unité.

    C'est même pire que ça, TMaClasse1 doit être complètement déclarée dans le même bloc Type que celui de sa déclaration forward.

    Ainsi, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type
      TMaClasse1 = class;
      TMaClasse2 = class(TObject)
      private
        FMaClasse1 : TMaClasse1;
      end;
     
      TMaClasse1 = class(TObject)
      private
        FMaClasse2 : TMaClasse2;
      end;
    Mais tu ne peux pas écrire (même dans la même unité) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    type
      TMaClass1 = class;
     
    type
      TMaClasse2 = class(TObject)
      private
        FMaClasse1 : TMaClasse1;
      end;
     
      TMaClasse1 = class(TObject)
      private
        FMaClasse2 : TMaClasse2;
      end;
    Tu auras une erreur :
    E2086 Le type 'TMaClass1' n'est pas encore complètement défini
    Sinon, pour ce qui est du cast, il faut savoir que ça ne concerne que le compilateur. Il n'y a aucune différence à l'exécution (Du moins en Delphi Win32) entre utiliser directement une variable du bon type, et faire un cast dans un autre type.
    Le cast ne fait pas de conversion de la variable, il se contente de dire au compilateur de l'interpréter différemment.

    Par contre c'est différent si tu travailles avec des interfaces et des objets COM.

  4. #4
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Sinon, pour ce qui est du cast, il faut savoir que ça ne concerne que le compilateur. Il n'y a aucune différence à l'exécution (Du moins en Delphi Win32) entre utiliser directement une variable du bon type, et faire un cast dans un autre type.
    Le cast ne fait pas de conversion de la variable, il se contente de dire au compilateur de l'interpréter différemment.
    COM.
    Merci, tu mets un terme à ce questionnement qui était mien jusqu'ici !

    Donc vive les références TObject et le casting !

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

Discussions similaires

  1. Réponses: 27
    Dernier message: 03/01/2008, 11h07
  2. [POO] Référence inter objet
    Par drclean86 dans le forum Langage
    Réponses: 2
    Dernier message: 21/01/2007, 18h39
  3. fonctions inter- classes
    Par THE_VIP dans le forum Général Python
    Réponses: 5
    Dernier message: 12/08/2006, 00h51
  4. Problème de référence de classe
    Par nmathon dans le forum Delphi
    Réponses: 7
    Dernier message: 21/06/2006, 16h46
  5. Référence des classes navigateur
    Par elvivo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 19/08/2005, 12h37

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