|
3. O objektových triedach |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
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; end; 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 |
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 |
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