Pengidentifikasi dengan Pembatas Unit

Mirip dengan namespace pada C++, Java dan C#

Konflik Pengidentifikasi Bernama Sama

Beberapa unit dapat mendefinisikan tipe / fungsi / variabel dengan nama yang sama. Unit yang berada di belakang daftar uses akan menimpa pengidentifikasi bernama sama dari unit sebelumnya.

Sintaks Pembatas Unit

NamaUnit.Pengidentifikasi menentukan sumber secara eksplisit, memaksa penggunaan definisi dari unit yang ditentukan dan menyelesaikan konflik penimpaan.

Dua bagian uses bekerja secara terpisah satu sama lain

  • interface uses : Hanya berlaku pada bagian interface;
  • implementation uses : Hanya berlaku pada bagian implementasi. Unit yang dipanggil di bagian implementasi akan menimpa pengidentifikasi bernama sama dari unit bagian interface.

Contoh

Buat unit bernama 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 language: JavaScript (javascript)

Kemudian buat unit lain bernama GoogleMapsEngine.pas

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

interface
type
  TColor = string; // Tipe yang benar-benar berbeda dengan Graphics.TColor

implementation

end.Code language: PHP (php)

Terdapat dua tipe TColor dengan nama yang sama meskipun tipe dasarnya berbeda

Selanjutnya tulis program utama

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

uses Graphics, GoogleMapsEngine;

var
  // Color: TColor; // Galat: Akan mengambil GoogleMapsEngine.TColor (tipe string) yang berada di belakang
  Color: Graphics.TColor; // Benar, batasi unit secara eksplisit

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

Kompilasi dan jalankan

Jika awalan Graphics. tidak ditulis, secara bawaan akan menggunakan GoogleMapsEngine.TColor, mengapa demikian?

Di program utama, penulisan pemanggilan unit adalah uses Graphics, GoogleMapsEngine;. Karena GoogleMapsEngine ditulis setelah Graphics, ketika ada TColor bernama sama, kompiler akan menggunakan definisi dari unit yang berada di belakang yaitu GoogleMapsEngine.TColor secara otomatis.

Jika ingin membedakan keduanya, tulis langsung Graphics.TColor. Cara kerjanya mirip namespace sehingga tidak akan terjadi konflik nama.

Contoh Salah

Tipe TColor di bagian interface dan implementasi tidak cocok, akan menimbulkan galat kompilasi

Buat unit baru bernama UnitUsingColors.pas

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

implementation
uses GoogleMapsEngine; // TColor di bagian implementasi menimpa tipe yang sama di interface

// TColor di sini merujuk ke GoogleMapsEngine.TColor
procedure ShowColor(const Color: TColor); 
begin
end;

end.Code language: JavaScript (javascript)

Program utama mydemo.dpr memanggil unit ini

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

uses UnitUsingColors;

begin

end.Code language: PHP (php)

Cukup panggil unit tanpa perlu memanggil fungsi atau prosedur di dalamnya. Jika tidak ada pemanggilan fungsi, kompiler tidak akan mengkompilasi UnitUsingColors.pas.

Penjelasan penyebab galat (sudut pandang kompiler):

// Tanda tangan interface
procedure ShowColor(const Color: Graphics.TColor);
// Tanda tangan implementasi
procedure ShowColor(const Color: GoogleMapsEngine.TColor);Code language: JavaScript (javascript)

Ubah kode menjadi seperti berikut

unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Tentukan secara eksplisit TColor dari Graphics agar tidak tertutup tipe bernama sama
procedure ShowColor(const Color: Graphics.TColor);
begin
end;
end.Code language: JavaScript (javascript)
unit UnitUsingColors;
{$mode objfpc}{$H+}
interface
uses Graphics;
procedure ShowColor(const Color: TColor);
implementation
uses GoogleMapsEngine;
// Tulis Graphics.TColor secara eksplisit untuk menyamakan tipe
procedure ShowColor(const Color: Graphics.TColor);
begin
  WriteLn(Red(Color), Green(Color), Blue(Color));
end;
end.Code language: JavaScript (javascript)

Ringkasan

Pembatas Unit NamaUnit.Pengidentifikasi dapat mengontrol asal tipe secara akurat tanpa mengubah urutan tulisan uses sehingga tidak akan ada konflik nama.

Pengidentifikasi dengan Pembatas Unit

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *