Forward

Adam Boduch

forward - słowo kluczowe języka Delphi

Po zadeklarowaniu nagłówka procedury czy funkcji należy także umieścić jej definicję w sekcji Implementation. Deklarowanie tych samych parametrów funkcji zarówno w definicji, jak i w deklaracji nie jest konieczne, tak jak to pokazano poniżej:

...
interface
  function Main(const : String) : Integer;
implementation
...
function Main(const : String) : Integer;
begin
 
end;
...

Można pominąć cały nagłówek funkcji w sekcji Implementation, skracając zapis do następującej postaci:

...
interface
  function Main(const : String) : Integer;
implementation
...
function Main;
begin
 
end;
...

Warto zwrócić uwagę, że w sekcji Implementation nie jest konieczne nawet wpisanie typu zwracanego przez funkcję Main ? wszystko to jest określone w definicji w sekcji Interface.

Dyrektywa forward wiąże się z deklarowaniem procedur bądź funkcji jedynie w sekcji Implementation albo w ogóle w pliku głównym programu (*.dpr). Wiadomo, że kompilator odczytuje kod od góry do dołu, wiec taki zapis będzie dla niego niepoprawny:

program Example;
 
{$APPTYPE CONSOLE}
 
procedure Main;
begin
{ wywołanie procedury, która jest nie widoczna, gdyż jej
  deklaracja znajduje się poniżej }
  DoIt('Test');
end;
 
procedure DoIt(var S : String);
begin
 
end;
 
begin
 
end.

Wczujmy się na chwilę w sposób pracy kompilatora. Analizując kod od góry do dołu, napotyka on na nieznaną instrukcję ? DoIt ? w ciele procedury Main. Owa instrukcja jest dla niego nierozpoznawalna, więc może przyjąć, że jest to jakaś funkcja. W tym momencie sprawdza kod powyżej i nie na potyka na procedurę ani funkcję o nazwie DoIt, a zatem zgłasza błąd. Czasem można spotkać się z takim problemem, jeśli zadeklarowanie procedury zaraz na początku jest niemożliwe, gdyż oddziałuje ona z kolei na inną procedurę, której kod znajduje się poniżej. W takim przypadku można zastosować dyrektywę forwardi napisać tak:

program Example;
 
{$APPTYPE CONSOLE}
 
uses Windows;
 
procedure DoIt(const S : String); forward;
 
procedure Main;
begin
{ wywołanie procedury, która jest nie dostępna, gdyż jej
  deklaracja znajduje się poniżej }
  DoIt('Test');
end;
 
procedure DoIt;
begin
  Writeln(S);
end;
 
begin
  Main; // wywołanie głównej procedury
end.

Powyższy kod zostanie skompilowany bez problemu, gdyż na samej górze zadeklarowaliśmy jedynie nagłówek procedury oraz opatrzyliśmy ją dyrektywą forward. Dalszy kod owej procedury można zapisać w dalszej części programu.

Zwróćmy uwagę, że jedynie nagłówek zawiera listę parametrów procedury. Ciało procedury zawiera tylko nazwę. Jest to przydatny zapis, gdyż niejeden raz projektant jest zmuszony do zmiany listy parametrów. Wówczas trzeba by zmienić te parametry w deklaracji procedury oraz w definicji, a dzięki dyrektywie forwardparametry są zapisane jedynie w definicji, stąd ich zmiana jest szybka i bezproblemowa.

Taką samą praktyke można zastosować w stosunku do klas, spójrz na poniższy przykład:

type
  TMain = class; 
 
{ tutaj jakiś kod }
 
  TMain = class
  public
      S : String;
      I : Integer;
  end;

Deklaracja klasy kończy się znakiem średnika - nie zawiera ona żadnych metod oraz pól. W dalszym miejscu kodu źródłowego można zadeklarować klasę o tej samej nazwie - tym razem z metodami i polami.

Zobacz też:

0 komentarzy