Identifiants qualifiés par unité

Similaire aux espaces de noms de C++, Java et C#

Conflits d’identifiants homonymes

Plusieurs unités peuvent définir des types / fonctions / variables portant le même nom. Les unités placées plus tard dans la liste uses masquent les identifiants identiques des unités précédentes.

Syntaxe de qualification par unité

NomUnite.Identifiant précise explicitement l’unité source, impose l’utilisation des définitions de l’unité ciblée et résout les conflits de masquage.

Les deux segments uses agissent indépendamment l’un de l’autre

  • interface uses : ne s’applique qu’à la section interface ;
  • implementation uses : ne s’applique qu’à la section implémentation. Les identifiants des unités de la section implémentation masquent ceux identiques des unités de la section interface.

Exemple

Créer une unité Graphics.pas

unit Graphics;
{$mode objfpc}{$H+}

interface

type
  TColor = LongInt;
const
  clYellow = 10;
function Red(C:TColor):Integer;
function Green(C:TColor):Integer;
function Blue(C:TColor):Integer;

implementation
function Red(C:TColor):Integer; begin Result:=C shr 16; end;
function Green(C:TColor):Integer; begin Result:=(C shr 8) and 255; end;
function Blue(C:TColor):Integer; begin Result:=C and 255; end;

end.Langage du code : JavaScript (javascript)

Créer ensuite une seconde unité GoogleMapsEngine.pas

unit GoogleMapsEngine;
{$mode objfpc}{$H+}

interface
type
  TColor = string; // Type totalement différent de Graphics.TColor

implementation

end.Langage du code : PHP (php)

Nous disposons désormais de deux types TColor homonymes mais de structures différentes

Écrire ensuite le programme principal

program showcolor;
{$mode objfpc}{$H+}
{$apptype CONSOLE}

uses Graphics, GoogleMapsEngine;

var
  // Color: TColor; // Erreur : résout GoogleMapsEngine.TColor (chaîne de caractères), plus tardif
  Color: Graphics.TColor; // Correct, qualification explicite de l'unité

begin
  Color := clYellow;
  WriteLn(Red(Color), ' ', Green(Color), ' ', Blue(Color));
  ReadLn;
end.Langage du code : PHP (php)

Compiler et exécuter

Si le préfixe Graphics. est omis, TColor pointe par défaut vers GoogleMapsEngine.TColor. Pourquoi ?

Le projet principal importe les unités via uses Graphics, GoogleMapsEngine;. GoogleMapsEngine étant déclaré en second, tout identifiant TColor dupliqué se résout par défaut sur l’unité la plus tardive : GoogleMapsEngine.TColor.

Pour les distinguer, écrire explicitement Graphics.TColor, à l’instar des espaces de noms, ce qui élimine tout conflit de nommage.

Exemple erroné

Une incompatibilité de type TColor entre la section interface et l’implémentation provoque une erreur de compilation

Créer une autre unité UnitUsingColors.pas

unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);

implementation
uses GoogleMapsEngine; // Le TColor de l'implémentation masque celui de l'interface

// Ici TColor désigne GoogleMapsEngine.TColor
procedure ShowColor(const Color: TColor); 
begin
end;

end.Langage du code : JavaScript (javascript)

Référencer cette unité dans le projet principal mydemo.dpr

program showcolor;
{$mode objfpc}{$H+}
{$apptype CONSOLE}

uses UnitUsingColors;

begin

end.Langage du code : PHP (php)

Une simple référence suffit même sans appel de procédure ou fonction ; si rien n’est invoqué, le compilateur ignore la compilation de UnitUsingColors.pas.

Décomposition de l’erreur (point de vue du compilateur) :

// Signature de l'interface
procedure ShowColor(const Color: Graphics.TColor);
// Signature de l'implémentation
procedure ShowColor(const Color: GoogleMapsEngine.TColor);Langage du code : JavaScript (javascript)

Modifier le code comme ci-dessous

unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Spécifier explicitement TColor issu de Graphics pour éviter le masquage du type homonyme
procedure ShowColor(const Color: Graphics.TColor);
begin
end;
end.Langage du code : JavaScript (javascript)
unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Indiquer explicitement Graphics.TColor pour unifier le type
procedure ShowColor(const Color: Graphics.TColor);
begin
  WriteLn(Red(Color), Green(Color), Blue(Color));
end;
end.Langage du code : JavaScript (javascript)

Résumé

Qualification par unité NomUnite.Identifiant permet de contrôler précisément l’origine des types sans modifier l’ordre des clauses uses et prévient tout conflit de nom.

Laisser un commentaire

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