Unit-qualifizierte Bezeichner

Ähnlich wie Namespaces in C++, Java und C#

Konflikte bei gleichnamigen Bezeichnern

Mehrere Units können Typen / Funktionen / Variablen mit identischem Namen definieren. Später aufgeführte Units in der uses-Liste verdecken gleichnamige Bezeichner aus vorherigen Units.

Syntax zur Unit-Qualifizierung

Unitname.Bezeichner gibt die Herkunft explizit an, erzwingt die Nutzung der Definition aus der festgelegten Unit und löst Verdeckungskonflikte auf.

Die zwei uses-Bereiche wirken unabhängig voneinander

  • interface uses : Wirkt nur auf den Interface-Bereich;
  • implementation uses : Wirkt nur auf den Implementierungsbereich. Units im Implementierungsbereich verdecken gleichnamige Bezeichner aus Units des Interface-Bereichs.

Beispiel

Erstelle eine 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.Code-Sprache: JavaScript (javascript)

Erstelle anschließend eine weitere Unit GoogleMapsEngine.pas

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

interface
type
  TColor = string; // Vollständig anderer Typ als Graphics.TColor

implementation

end.Code-Sprache: PHP (php)

Es existieren zwei gleichnamige TColor-Typen mit abweichender Struktur

Schreibe nun das Hauptprogramm

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

uses Graphics, GoogleMapsEngine;

var
  // Color: TColor; // Fehler: Greift auf das spätere GoogleMapsEngine.TColor (String) zu
  Color: Graphics.TColor; // Korrekt, explizite Unit-Qualifizierung

begin
  Color := clYellow;
  WriteLn(Red(Color), ' ', Green(Color), ' ', Blue(Color));
  ReadLn;
end.Code-Sprache: PHP (php)

Kompiliere und starte das Programm

Wenn das Präfix Graphics. weggelassen wird, wird standardmäßig GoogleMapsEngine.TColor verwendet. Warum?

Im Hauptprojekt steht uses Graphics, GoogleMapsEngine;. Da GoogleMapsEngine später angegeben ist, wird bei doppeltem TColor automatisch der Typ aus der späteren Unit, also GoogleMapsEngine.TColor, aufgelöst.

Um beide Typen voneinander abzugrenzen, schreibe explizit Graphics.TColor. Das funktioniert wie Namespaces und verhindert Namenskonflikte.

Fehlerbeispiel

Abweichende TColor-Typen im Interface- und Implementierungsbereich führen zu einem Kompilierfehler

Erstelle eine weitere Unit UnitUsingColors.pas

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

implementation
uses GoogleMapsEngine; // Gleichnamiges TColor im Implementierungsbereich verdeckt das Interface-TColor

// Dieses TColor bezieht sich auf GoogleMapsEngine.TColor
procedure ShowColor(const Color: TColor); 
begin
end;

end.Code-Sprache: JavaScript (javascript)

Binde diese Unit im Hauptprogramm mydemo.dpr ein

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

uses UnitUsingColors;

begin

end.Code-Sprache: PHP (php)

Es genügt die bloße Einbindung der Unit, auch ohne Aufruf von Funktionen oder Prozeduren. Wird nichts daraus aufgerufen, überspringt der Compiler die Kompilierung von UnitUsingColors.pas.

Aufschlüsselung der Fehlerursache (Sicht des Compilers):

// Interface-Signatur
procedure ShowColor(const Color: Graphics.TColor);
// Implementierungs-Signatur
procedure ShowColor(const Color: GoogleMapsEngine.TColor);Code-Sprache: JavaScript (javascript)

Passe den Code wie folgt an

unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Explizite Angabe von TColor aus Graphics, um Verdeckung durch den gleichnamigen Typ zu vermeiden
procedure ShowColor(const Color: Graphics.TColor);
begin
end;
end.Code-Sprache: JavaScript (javascript)
unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Explizite Angabe von Graphics.TColor zur Vereinheitlichung des Typs
procedure ShowColor(const Color: Graphics.TColor);
begin
  WriteLn(Red(Color), Green(Color), Blue(Color));
end;
end.Code-Sprache: JavaScript (javascript)

Zusammenfassung

Unit-Qualifizierung Unitname.Bezeichner steuert die Typherkunft präzise, ohne die Reihenfolge der uses-Klauseln ändern zu müssen, und verhindert Namenskonflikte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert