
Envoyé par
ALWEBER
Remarque sur la notion d'instance : J'ai choisi d'utiliser la notion d'instance plutôt que 'déclaration de la classe' car dans le cas qui est présenté la variable fV2 est bien localisée dans cet espace mémoire
Oui mais c'est faux de parler d'instance. Une instance est une allocation dynamique en fonction d'une déclaration.

Envoyé par
ALWEBER
Une première instance de classe est automatiquement créée au lancement du programme et sert de déclaration de la classe.
Et comment cela serait-il possible ? Imagine simplement que le constructeur attende un certain nombre de paramètres, comment ceux-ci pourraient-ils être évalués ?
La déclaration de la classe est en mémoire, oui ! Mais c'est le programme après tout ! Pour illustrer cela, je te propose une autre petit démo :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| type
TDemo = class
procedure Test;
end;
var
Demo :TDemo = nil;
procedure TDemo.Test;
begin
ShowMessage('Texte');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Demo.Test;
end; |
Il n'y a aucune instance de
TDemo qui est créée, mais ça fonctionne ! Le code est là et exécutable et pourtant il n'y a pas de
class var,
class function, etc.

Ajoutons maintenant une variable qui elle devrait être allouée (donc y avoir un
Create) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| type
TDemo = class
Value :string;
procedure Test;
end;
var
Demo :TDemo = nil;
procedure TDemo.Test;
begin
ShowMessage(Value);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Demo.Test;
end; |
Nous obtenons une belle violation d'accès. Normal !
Peut-on tester s'il y a bien eu allocation ? Oui, par
Self :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| type
TDemo = class
Value :string;
procedure Test;
end;
var
Demo :TDemo = nil;
procedure TDemo.Test;
begin
if Self <> nil then
ShowMessage(Value);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Demo.Test;
end; |
Pas de
ShowMessage, mais plus de VA

En bref le code est toujours là et exécutable et ce n'est que
Self (un pointeur sur les données propres à cette instance) qui est déterminant.

Envoyé par
ALWEBER
Lorsque l'objet défini contient des Class Var, Class Property, Class Function, etc. L'accès à l'un de ces Class éléments ce fait en préfixant l'élement par le type de la classe.
A nouveau c'est faux et à nouveau tu prouves le contraire dans ton exemple en appelant une fois
TDemo.classfunc2 et l'autre
aDemo.classfunc2. Mais puisque c'est une méthode de classe
Self représente ici toujours la classe et non l'instance
aDemo. La seule méthode de classe où
Self représente l'instance est... le constructeur
2 |
0 |