Identificadores calificados por unidad

Similar a los espacios de nombres de C++, Java y C#

Conflictos de identificadores con el mismo nombre

Múltiples unidades pueden definir tipos / funciones / variables con nombres idénticos. Las unidades que aparezcan más tarde en la lista uses ocultarán los identificadores homónimos de las unidades anteriores.

Sintaxis de calificación por unidad

NombreUnidad.Identificador especifica explícitamente el origen, obliga a utilizar la definición de la unidad indicada y resuelve los conflictos de ocultación.

Los dos bloques uses actúan de forma independiente

  • interface uses:solo afecta a la sección de interfaz;
  • implementation uses:solo afecta a la sección de implementación. Los identificadores de unidades de la sección de implementación ocultan aquellos homónimos de las unidades de la interfaz.

Ejemplo

Crea una unidad llamada 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.Lenguaje del código: JavaScript (javascript)

Luego crea otra unidad GoogleMapsEngine.pas

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

interface
type
  TColor = string; // Tipo totalmente distinto a Graphics.TColor

implementation

end.Lenguaje del código: PHP (php)

Tenemos dos tipos TColor con el mismo nombre aunque su estructura interna sea distinta

A continuación escribe el programa principal

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

uses Graphics, GoogleMapsEngine;

var
  // Color: TColor; // Error: tomará GoogleMapsEngine.TColor (tipo cadena) por aparecer después
  Color: Graphics.TColor; // Correcto, calificación explícita de unidad

begin
  Color := clYellow;
  WriteLn(Red(Color), ' ', Green(Color), ' ', Blue(Color));
  ReadLn;
end.Lenguaje del código: PHP (php)

Compila y ejecuta

Si omites el prefijo Graphics., se usará por defecto GoogleMapsEngine.TColor. ¿Por qué?

En el proyecto principal escribimos uses Graphics, GoogleMapsEngine;. Al aparecer GoogleMapsEngine en segundo lugar, cuando coincidan nombres como TColor, el compilador resuelve por defecto el tipo de la unidad posterior: GoogleMapsEngine.TColor.

Para diferenciarlos, escribe explícitamente Graphics.TColor. Funciona igual que los espacios de nombres y elimina cualquier conflicto de nombres.

Ejemplo erróneo

Si los tipos TColor de la sección interfaz y la implementación no coinciden, se producirá un error de compilación

Crea una nueva unidad UnitUsingColors.pas

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

implementation
uses GoogleMapsEngine; // El TColor de implementación oculta el definido en interfaz

// Aquí TColor hace referencia a GoogleMapsEngine.TColor
procedure ShowColor(const Color: TColor); 
begin
end;

end.Lenguaje del código: JavaScript (javascript)

Referencia esta unidad en el programa principal mydemo.dpr

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

uses UnitUsingColors;

begin

end.Lenguaje del código: PHP (php)

Basta con referenciar la unidad sin invocar sus funciones o procedimientos; si no se llama nada de su interior, el compilador saltará su compilación.

Desglose de la causa del error (punto de vista del compilador):

// Firma de interfaz
procedure ShowColor(const Color: Graphics.TColor);
// Firma de implementación
procedure ShowColor(const Color: GoogleMapsEngine.TColor);Lenguaje del código: JavaScript (javascript)

Modifica el código como se muestra a continuación

unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Especifica explícitamente el TColor de Graphics para evitar el ocultamiento por tipo homónimo
procedure ShowColor(const Color: Graphics.TColor);
begin
end;
end.Lenguaje del código: JavaScript (javascript)
unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Escribe explícitamente Graphics.TColor para unificar el tipo
procedure ShowColor(const Color: Graphics.TColor);
begin
  WriteLn(Red(Color), Green(Color), Blue(Color));
end;
end.Lenguaje del código: JavaScript (javascript)

Resumen

Calificación de unidad NombreUnidad.Identificador permite controlar con precisión el origen de los tipos sin modificar el orden de las sentencias uses, evitando conflictos de nombres.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *