3. O objektových triedach
Domovská stránka Programovanie v C++ OOP a Windows Ročníkový projekt Princípy počítačov Princípy databáz Všeličo Kontakt

 

Na prednáške:


Triedne metódy

Zadefinujeme triedu TA s jednou triednou metódou (po anglicky: class method) PopisTriedy a jednou obyčajnou metódou Vypis :

type
  TA=class
    class function PopisTriedy: string;
    procedure Vypis;
  e
nd;

class
function TA.PopisTriedy: string;
begin
  Result:='Toto je trieda TA';
end;

procedure TA.Vypis;
begin
  ShowMessage(PopisTriedy);
end;

Ako vidíme, triedne metódy sa dajú volať priamo z iných metód objektu. Triednu metódu môžeme vyvolať aj nasledujúcim spôsobom:

  ShowMessage(TA.PopisTriedy);

Alebo, ak má triedna metóda prístupové práva public, aj nasladovne:

var
  A: TA;
begin
  A:=TA.Create;
  ShowMessage(A.PopisTriedy);
end;

Triedne metódy sa využívajú na prácu s triedou (s typom) - nie s objektom.

Triedne metódy sa dajú dediť podobne, ako obyčajné metódy. Už aj TObject má zadefinovaných niekoľko triednych metód, napríklad:

Triedne metódy môžu byť virtuálne. Ukážka - odvodíme potomka triedy TA, v ktorom predefinujeme metódu PopisTriedy:

type
  TB=class(TA)
    class function PopisTriedy: string;
  end;

class function TB.PopisTriedy: string;
begin
  Result:='Toto je trieda TB';
end;

Vyskúšame:

  TB.PopisTriedy ... vráti reťazec 'Toto je trieda TB'

Nasledujúce príkazy však nezobrazia predchádzajúcu správu:

  var
    B: TB;
  begin
    B:=TB.Create;
    B.Vypis;
... chyba - zobrazí sa správa 'Toto je trieda TA'
  end
;

Metóda Vypis použila starú triednu metódu PopisTriedy. Ak sa má používať vždy najnovšia metóda PopisTriedy, je potrebné, aby bola zavedená ako virtuálna metóda:

type
  TA=class
    class function PopisTriedy: string; virtual;
   
...

type
  TB=class(TA)
    class function PopisTriedy: string; override;
   
...

Aj keď triedne metódy vyzerajú na prvý pohľad ako obyčajné metód, netreba sa dať týmto dojmom zviesť. Triedne metódy nevedia používať atribúty objektu, ani volať iné - obyčajné metódy:

type
  TA=class
    Pom: Integer
    class procedure Test;
   
...

class procedure TA.Test;
begin
 
Pom:=123;                
... chyba - nevie, akému objektu by sa mal nastaviť atribút
  Vypis;                   
... chyba - nevie, pre aký objekt by sa mal vykonať Vypis
  ShowMessage(PopisTriedy); // OK
end;

Poznámky:


Premenná typu trieda

Do premennej typu trieda môžeme priraďovať typy objektových tried:

type
  TAClass=class of TA;

var
  X: TAClass;
  A: TA;

begin
  X:=TA;         //
v premennej X je uložený typ TA
  X.PopisTriedy; //
zavolá triednu metódu TA.PopisTriedy
  A:=X.Create;   //
vytvorí objekt TA a zavolá jeho konštruktor
  X:=nil;        // X neukazuje na žiadne informácie
  X:=TB;         // v premennej X je uložený typ TB
  if X=TB then ShowMessage('Toto sa vypíše');
  A:=X.Create;   //
skonštruuje objekt typu TB
  A.Vypis;       //
zobrazí správu 'Toto je trieda TB'
  X=TObject;    
... chyba ... nekompatibilné typy
end;

Do premennej X môžeme priradiť buď:

Ďalšie vlastnosti:

V Delphi sú niektoré triedne typy už zadefinované:


Virtuálny konštruktor

Do tried TA a TB pridáme konštruktory:

type
  TA=class
    constructor Create;
  end;
  TB=class(TA)
    constructor Create;
  end;

constructor TA.Create;
begin
  ShowMessage('TA.Create');
end;

constructor TB.Create;
begin
  ShowMessage('TB.Create');
end;

Konštruovanie objektov pomocou triednej premennej (X je premenná typu class of TA):

  X:=TA;
  X.Create;  //
vznikne objekt typu TA, zavolá sa TA.Create
  X:=TB;
  X.Create; 
... chyba - vznikne objekt typu TB, ale zavolá sa TA.Create

Spomeňme si, že konštruktor sa v takomto prípade správa ako triedna metóda. Ak triedna metóda nie je označená ako virtuálna, zavolá sa Create triedy TA. Po malej úprave programu, sa už zavolá správny konštruktor:

type
  TA=class
    constructor Create; virtual;
  end;
  TB=class(TA)
    constructor Create; override;
  end;


Použitie premenných typu trieda

Vytvoríme krátky program, ktorý nám umožní vkladať do formulára komponenty: tlačidlá, popisy a iné.

uses
 
... StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    Index: Integer;
  public
  procedure ButtonClick(Sender: TObject);
end;

V poli Prvky máme zoznam s triedami komponentov, ktoré sa dajú ukladať do formulára:

var
  Prvky: array[0..2] of record
    Trieda: TControlClass;
    Popis: string;
    Pocet: Integer;
  end = (
    (Trieda: TButton; Popis: 'Button'),
    (Trieda: TLabel; Popis: 'Label'),
    (Trieda: TMemo; Popis: 'Memo'));

Vytvoríme tlačidlá, ktorými bude možné určiť typ komponentu:

procedure TForm1.FormCreate(Sender: TObject);
var
  Index: Integer;
  B: TButton;
begin
  for Index:=Low(Prvky) to High(Prvky) do begin
    Prvky[Index].Pocet:=0;
    B:=TButton.Create(Self);
    B.Parent:=Self;
    B.SetBounds(Index*100, 0, 90, 24);
    B.Caption:=Prvky[Index].Popis;
    B.Tag:=Index;
    B.OnClick:=ButtonClick;
  end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
  Index:=(Sender as TButton).Tag;
end;

Pri stlačení tlačidla myši nad formulárom, vytvoríme komponent:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  C: TControl;
begin
  Inc(Prvky[Index].Pocet);
  C:=Prvky[Index].Trieda.Create(Self);
  C.Parent:=Self;
  C.SetBounds(X, Y, C.Width, C.Height);
  C.SetTextBuf(PChar(Prvky[Index].Popis+IntToStr(Prvky[Index].Pocet)));
end;

©  2003 Ľubomír SALANCI