Références mutuelles entre unités

Compréhension

Les unités peuvent dépendre et se référencer mutuellement. Lorsqu’une unité en référence une autre, l’unité référencée peut être déclarée soit dans la section interface, soit uniquement dans la section implementation. Voici les différences entre les deux méthodes :

Déclaré dans interface (référence côté interface) : vous pouvez définir de nouveaux éléments publics (procédures, types personnalisés…) visibles de l’extérieur à partir du contenu de l’unité référencée, accessibles par toutes les autres unités du projet.

Déclaré uniquement dans implementation (référence côté implémentation) : la portée est limitée. Les identifiants de l’unité référencée ne sont utilisables que dans le code d’implémentation de l’unité courante et ne sont pas accessibles depuis l’extérieur.

Exemple

Ce code n’est qu’une démonstration. Le lecteur n’a pas encore étudié les classes, il suffit de saisir le concept pour l’instant.

Créer un nouveau fichier d’unité Classes.pas

unit Classes;
{$mode objfpc}{$H+}
interface
type
  TObject=class;
  TComponent=class(TObject)
    constructor Create(AOwner:TComponent);virtual;
  end;
  TObject=class
    destructor Destroy;virtual;
  end;
implementation
constructor TComponent.Create(AOwner:TComponent);begin end;
destructor TObject.Destroy;begin end;
end.

Puis référencer cette unité dans AnotherUnit.pas

unit AnotherUnit;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}

interface
uses
  Classes;
// La classe TComponent est définie dans l’unité Classes, il faut donc référencer Classes dans la section interface
procedure DoSomethingWithComponent(var C: TComponent);

implementation
uses SysUtils; // SysUtils référencé uniquement dans la section implementation

procedure DoSomethingWithComponent(var C: TComponent);
begin
  // FreeAndNil provient de SysUtils et n’est appelé que dans le code d’implémentation ; il suffit de le référencer dans implementation
  FreeAndNil(C);
end;

end.Langage du code : JavaScript (javascript)

Remarques

1 Les dépendances circulaires bidirectionnelles sont interdites dans la section interface

Il est interdit que deux unités se référencent mutuellement dans leurs sections interface respectives en même temps.

Principe : Lors de l’analyse de l’interface d’une unité, le compilateur doit résoudre complètement toutes les unités dépendantes listées dans la clause uses de la section interface de cette unité. Pascal respecte strictement cette règle, ce qui apporte deux grands avantages :

Compilation plus rapide ; le compilateur détermine automatiquement quelles unités doivent être recompilées sans gestion manuelle de scripts de build Makefile complexes. Il n’est pas nécessaire de recompiler l’intégralité du projet après modification du code, tout en garantissant la mise à jour synchronisée de toutes les dépendances.

2 Les dépendances circulaires sont autorisées dans la section implementation

Une dépendance circulaire est valide à condition qu’au moins une des deux unités ne référence l’autre que dans sa section implementation.

Exemple : L’unité A référence l’unité B dans sa section interface, tandis que l’unité B ne référence l’unité A que dans sa section implementation. Cette structure circulaire bidirectionnelle est entièrement prise en charge par le compilateur.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *