Conceptos básicos
Las unidades pueden depender y referirse unas a otras. Cuando una unidad hace referencia a otra, la unidad referenciada se puede declarar tanto en la sección interface como únicamente en la sección implementation. Aquí las diferencias entre ambos enfoques:
Declarado en interface (referencia en sección de interfaz): Se pueden definir nuevos elementos públicos (procedimientos, tipos personalizados, etc.) visibles externamente basándose en el contenido de la unidad referenciada, accesibles para todas las demás unidades del proyecto completo.
Declarado solo en implementation (referencia en sección de implementación): El alcance queda restringido. Los identificadores de la unidad referenciada solo se pueden usar dentro del código de implementación de la unidad actual y no son accesibles desde fuera.
Ejemplo
Este código es solo una demostración. El lector aún no ha estudiado las clases, así que solo hace falta comprender el concepto por ahora.
Crea un nuevo archivo de unidad llamado 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.
Luego haz referencia a esta unidad dentro de AnotherUnit.pas
unit AnotherUnit;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
interface
uses
Classes;
// La clase TComponent se define en la unidad Classes, por lo que hay que referenciar Classes en la sección interface
procedure DoSomethingWithComponent(var C: TComponent);
implementation
uses SysUtils; // SysUtils referenciado únicamente en la sección implementation
procedure DoSomethingWithComponent(var C: TComponent);
begin
// FreeAndNil pertenece a SysUtils y solo se invoca en el código de implementación; basta con referenciarlo en implementation
FreeAndNil(C);
end;
end.Lenguaje del código: JavaScript (javascript)
Notas importantes
1 Se prohíben las dependencias circulares bidireccionales en la sección interface
No se permite que dos unidades se refieran mutuamente en sus secciones interface respectivas al mismo tiempo.
Principio: Al analizar la interfaz de una unidad, el compilador debe resolver por completo todas las unidades dependientes listadas en la cláusula uses de la sección interface de dicha unidad. Pascal cumple estrictamente esta norma y ofrece dos grandes ventajas:
Mayor velocidad de compilación; el compilador detecta automáticamente qué unidades necesitan recompilarse sin necesidad de mantener manualmente complejos scripts de compilación Makefile. No hace falta recompilar todo el proyecto tras editar el código y se garantiza la actualización sincronizada de todas las dependencias.
2 Se permiten las dependencias circulares en la sección implementation
Una dependencia circular es válida siempre que al menos una de las partes haga referencia a la otra unidad exclusivamente dentro de la sección implementation.
Ejemplo: La unidad A referencia la unidad B en su sección interface, mientras que la unidad B solo referencia la unidad A en su sección implementation. Esta estructura circular bidireccional es totalmente compatible con el compilador.