Delphi 2010 - Class (aneb Static nebo Shared) constructory (a destructory)

vložil Radek Červinka 7. února 2010 21:16

Delphi 2010 přináší kromě již uvedených rozšíření jazyka i koncept class constructor (v jiných jazycích nazýván Static nebo Shared), tj. konstruktor specifický pro třídu (neplést s klasickým konstruktor objektu). Tento nový konstruktor je volán pouze jednou (a nebo vůbec - viz. níže) pro každou třídu.

Raději příklad, pak si řekneme ještě více.

    1program Project1;
    2{$APPTYPE CONSOLE}
    3
    4type
    5  TTestConst = class
    6  public
    7    class constructor Create;
    8    class destructor Destroy;
    9    constructor Create;
   10    destructor Destroy; override;
   11  end;
   12
   13{ TTestConst }
   14
   15class constructor TTestConst.Create;
   16begin
   17  writeln('class Create');
   18end;
   19
   20constructor TTestConst.Create;
   21begin
   22  writeln ('klasicky create');
   23end;
   24
   25destructor TTestConst.Destroy;
   26begin
   27  writeln('klasicky destroy');
   28  inherited;
   29end;
   30
   31class destructor TTestConst.Destroy;
   32begin
   33  writeln('Class destroy');
   34end;
   35
   36begin
   37  writeln ('begin');
   38  with TTestConst.Create do
   39  begin
   40    try
   41
   42    finally
   43      Free;
   44    end;
   45  end;
   46  with TTestConst.Create do
   47  begin
   48    try
   49
   50    finally
   51      Free;
   52    end;
   53  end;
   54  writeln('end');
   55end.

Po spuštění se zobrazí:

class Create
begin
klasicky create
klasicky destroy
klasicky create
klasicky destroy
end
Class destroy

Co jsem tím ukázal? Nový konstruktor je volán jen jednou, je volán před začátkem programu nebo před provádění sekce initialization pokud je třída v unitu (a destructor je volán na konci programu nebo po sekci finalization v unitu). Jejich volání postupuje (až na určité malé výjimky) v pořadí jako je initialization unitu, v unitu to je v pořadí jak jsou třídy uvedeny (tedy pokud se na sebe neodkazují - to může být ta výjimka).

Každopádně by mělo být zaručeno, že před počátkem vykonávání sekce initialization jsou provedeno všechny class konstruktory v jednotce. Jediná výjimka může být, že celá třída není použita v programu a je tudíž eliminována linkerem. V tomto případě není ani konstruktor volán.

A zde je i první výhoda proti použití klasické sekce initialization. Pokud totiž není třída linkována, je přesto sekce initialization vykonána - což neplatí o class construktoru.

Druhá výhoda je vylepšení kompatibility s Delphi Prism, který tento konstruktor obsahuje.

Třetí výhoda je takový lepší pocit, že Váš program je zase o kapánek více OOP :-) (prostě lepší zapouzdření).

Poznámky:

  • jméno nemusí být Create a Destroy, ale musí být jen jeden konstruktor a destruktor v rámci třídy
  • nemají parametry, nejdou přímo volat
  • nemohou být virtual, dynamic nebo message


Nabízíme Delphi školení a konzultace na různá témata, primárně ve Vaší firmě.

Tagy: ,

Jazyk

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS