Bonjour
je souhaite savoir la différence entre type et un nouveau type ?
pourquoi ce code ce compile ?Code:
1
2
3
4
5
6
7
8
9
10 TSomething=class procedure A(); end; TSomething2=type TSomething; TSomething2.A(); begin end;
Version imprimable
Bonjour
je souhaite savoir la différence entre type et un nouveau type ?
pourquoi ce code ce compile ?Code:
1
2
3
4
5
6
7
8
9
10 TSomething=class procedure A(); end; TSomething2=type TSomething; TSomething2.A(); begin end;
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,
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.
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
comme cet exemple dans Delphi XE3Code:
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. }
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++
ajouter "type" de devant le type permet de forcer un typage fort sans pour autant changer la définition du type.
exemple:
ici TNombre est un bête Integer, mais dans ma fonction Test je ne veux traiter que des TNombre, jamais des Integer.Code:
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;
J'aurai appris quelque chose aujourd'hui ;)
http://docwiki.appmethod.com/appmeth...ation_de_types
Ce code ne compile pas en Delphi 5 (oui ! je sais...)
et j'obtiens avec Lazarus (CodeTyphon 5.20) une erreur au même endroit :Code:
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;
Citation:
unit1.pas(68,22) Error: overloaded functions have the same parameter list
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:
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;
Tu as raison, mais dans la mesure où on on avait une identité de type tout en les distinguant (on ne peut coller une variable de type2 dans une variable de type1, ce qui serait le cas en cas d'héritage), n'était-il pas tentant de voir si à déclarations identiques, l'implémentation ne pouvait être différente ?
euh...ben ça me parait tout bêtement pas logique comme raisonnement :) d'une part car on ne peux pas implémenter une méthode qui n'a pas été déclarée, or TSecondType ne déclare rien...et en plus le but du "x = type y" n'est pas de redéfinir y, mais uniquement de définir un nouveau type identique.
je n'ai personnellement jamais utilisé cette syntaxe car je n'en ai jamais eut besoin...mais il y a des cas où cela peut avoir un sens. Par exemple, une API qui déclare des Handle de différents types que l'on voudrait distingués alors que ce ne sont finalement que des THandle
on a ici des Handle fortement typés qui ne sont pas interchangeables tout en étant simplement des THandle.Code:
1
2
3
4 type THandleConnexion = type THandle; THandleDatabase = type THandle;
merci pour vos reponses
oui effectivement c'est lier l'identification nominale de type