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 :

Différence entre type et alias de type


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut Différence entre type et alias de type
    Bonjour
    je souhaite savoir la différence entre type et un nouveau type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     TSomething=class
       procedure A();
     end;
     TSomething2=type  TSomething;
     
     
     TSomething2.A();
     begin
     end;
    pourquoi ce code ce compile ?

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 547
    Billets dans le blog
    10
    Par défaut Quelle version de Delphi
    Citation Envoyé par Montor Voir le message
    Bonjour
    je souhaite savoir la différence entre type et un nouveau type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     TSomething=class
       procedure A();
     end;
     TSomething2=type  TSomething;
     TSomething2.A();
     begin
     end;
    pourquoi ce code se compile ?
    Tu es sur quelle version de Delphi ?
    Peux tu mettre ton exemple complet et je pense pouvoir te donner une réponse

  3. #3
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Tu es sur quelle version de Delphi ?
    Peux tu mettre ton exemple complet et je pense pouvoir te donner une réponse
    merci pour ta réponse

    je suis sous D7 je n'ai pas l'EDI sous les yeux m'ai j'etai clair dans mon premier poste regarde la méthode A est declareé dans la classe TSomething et et son implémentation fait référence TSomething2.A; si TSomething2 etait declaré TSomething2=TSomething; ca aurait un sens non,

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 942
    Billets dans le blog
    6
    Par défaut
    type TSecondType = type TFirstType; crée un type distinct du premier, mais sur le même modèle. Ce n'est pas simplement déclarer un alias de nom pour le même type, comme dans la déclaration type TSecondType = TFirstType;. Pour la compatibilité des affectations, je ne sais pas si elle demeure, les types étant différents et non identiques ou en lignée.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 547
    Billets dans le blog
    10
    Par défaut
    Le terme "Clause" est je pense un terme dérivé de la logique.

    On trouve la définition de la clause type dans le langage Algol qui est l'ancêtre du Pascal

    la "clause type" définit une équivalence de définition entre deux termes

    Dans ton exemple
    "TSomething" est equivalent à "class procedure A(); end;"
    "TSomething2" est equivalent à "TSomething" lui même equivalent à "Type TSomething"

    Après il est possible d'implémenter le contenu de la procedure A soit par

    TSomething2.A();
    begin
    end;

    soit par

    TSomething.A();
    begin
    end;

    Ce qui revient au même

    Dans Delphi je n'ai trouvé cette forme d'écriture que pour réintroduire des termes prédéclarés dans le compilateur et n'ayant pas d'existence dans les unité Delphi.

    cf. commentaire dans l'unité système
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       { Predefined constants, types, procedures, }
                 { and functions (such as True, Integer, or }
                 { Writeln) do not have actual declarations.}
                 { Instead they are built into the compiler }
                 { and are treated as if they were declared }
                 { at the beginning of the System unit.     }
    comme cet exemple dans Delphi XE3

    type
    CppLongInt = type LongInt; {$EXTERNALSYM CppLongInt 'long' } {$OBJTYPENAME CppLongInt 'Bl' 'Gl'}
    CppULongInt = type LongWord; {$EXTERNALSYM CppULongInt 'unsigned long'} {$OBJTYPENAME CppULongInt 'Bul' 'Gm'}

    qui permet d'avoir une terminologie commune pour avoir un programme mixte Pascal/C++

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ajouter "type" de devant le type permet de forcer un typage fort sans pour autant changer la définition du type.

    exemple:
    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
     
    type
      TNombre = type Integer;
     
    procedure Test(var T: TNombre);
    begin
      T := 1;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      N: TNombre;
      I: Integer;
    begin
      Test(N);
      Test(I); // les types de paramètres VAR originaux et formels doivent être identiques
    end;
    ici TNombre est un bête Integer, mais dans ma fonction Test je ne veux traiter que des TNombre, jamais des Integer.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 547
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ajouter "type" de devant le type permet de forcer un typage fort sans pour autant changer la définition du type.
    J'aurai appris quelque chose aujourd'hui

    http://docwiki.appmethod.com/appmeth...ation_de_types

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 942
    Billets dans le blog
    6
    Par défaut
    Ce code ne compile pas en Delphi 5 (oui ! je sais...)
    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
    type
      TFirstType = class
        function ReturnTypeNumber: integer;
      end;
     
    type
      TSecondType = type TFirstType;
     
    function TFirstType.ReturnTypeNumber: integer;
    begin
      Result := 1;
    end;
     
    function TSecondType.ReturnTypeNumber: integer; // [Error] Unit1.pas(356): Identifier redeclared: 'TFirstType.ReturnTypeNumber'
    begin
      Result := 2;
    end;
     
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
      FirstTypeObject: TFirstType;
      SecondTypeObject: TSecondType;
    begin
      FirstTypeObject := TFirstType.Create;
      SecondTypeObject := TSecondType.Create;
      if FirstTypeObject.ReturnTypeNumber = SecondTypeObject.ReturnTypeNumber
      then ShowMessage('identiques')
      else ShowMessage('différents')
      FirstTypeObject.Free;
      SecondTypeObject.Free;
    end;
    et j'obtiens avec Lazarus (CodeTyphon 5.20) une erreur au même endroit :
    unit1.pas(68,22) Error: overloaded functions have the same parameter list
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Ce code ne compile pas en Delphi 5 (oui ! je sais...)
    c'est normal, dans ton code, TSecondType n'est pas une nouvelle classe, c'est juste un nouveau type pour la même classe. Si tu veux modifier ReturnTypeNumber il faut créer une méthode virtual et la surchargée dans une classe dérivée
    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
    type
      TFirstType = class
        function ReturnTypeNumber: integer; virtual;
      end;
     
      TSecondType = class(TFirstType)
        function ReturnTypeNumber: integer; override;
      end;
     
    function TFirstType.ReturnTypeNumber: integer;
    begin
      Result := 1;
    end;
     
    function TSecondType.ReturnTypeNumber: integer; 
    begin
      Result := 2;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. [Type Sql] Quelles différences entre ces bases ?
    Par wonderboy dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 16/03/2006, 10h38
  2. [SQL_DOUBLE & SQL_D_FLOAT] différence entres 2 types
    Par jean-jacques varvenne dans le forum SQL
    Réponses: 12
    Dernier message: 01/04/2005, 18h04
  3. Réponses: 11
    Dernier message: 31/01/2005, 18h48
  4. Résultats erroné différence entre deux types TDateTime
    Par Alghero dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/03/2004, 18h03
  5. fopen -> différences entres les types d'ouvertur
    Par Patrick PETIT dans le forum C
    Réponses: 10
    Dernier message: 01/06/2003, 19h19

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