CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
Polymorfismus a virtuální metody
Polymorfismus je
obecně vlastnost, diky níž může mít totéž jméno (proměnné,
funkce, procedury,…) více rozdílných významů. V OOP to specielně
znamená, že metody objektů,
i když mají stejná jména, se chovají různě podle toho, v jakém
kontextu jsou zavolány. Později také uvidíme, že různé objekty mohou
na tutéž zprávu reagovat různě. Polymorfismus se v Delphi
projevuje ve dvou rovinách podle toho, podle čeho se vybere správná verze
metody:
Vybírá se podle kontextu třídy – to jsou statické, dynamické a virtuální metody..
Vybírá se podle parametru – tzn. přetěžování, je uvedeno v jiné otázce
inherited
Příklad:
Definujeme si následující třídy:
type TRodic = class
function GetWay:string;
end;
type TPotomek = class(TRodic)
function GetWay:string;
end;
implementation
function TRodic.GetWay:string;
begin
result:='Rodic mluvi';
end;
function TPotomek.GetWay:string;
begin
result:='Potomek mluvi';
end;
Do pole Edit1 se vypíše text „Rodic mluvi'“ a to i přesto, že je s proměnnou test typu TRodic svázaná instance objektu TPotomek. Prostě se nejdříve použije metoda rodiče, která je staticky svázaná s níže uvedenou instancí.
procedure TForm1.Button1Click(Sender: TObject);
var test:TRodic;
begin
test:=TPotomek.Create;
Edit1.Text:=test.GetWay;
test.Free;
end;
Dynamická (pozdní) vazba
Metody dynamické se používají ke stejnému účelu jako virtuální. Jsou označovány v deklaraci třídy jako dynamic
procedure Test5; dynamic;Rozdílem je, že dynamické procedury jsou pomalejší, ale zabírají méně prostoru. Používají se v případě, že základní třída má mnoho metod, které se sice mohou předefinovat, ale neděje se tak příliš často, a navíc má mnoho následníků.
Příklad:
Definujeme si následující třídy:
type TRodic = class
function GetWay:string; dynamic;
end;
type TPotomek = class(TRodic)
function GetWay:string; override;
end;
implementation
function TRodic.GetWay:string;
begin
result:='Rodic mluvi';
end;
function TPotomek.GetWay:string;
begin
result:='Potomek mluvi';
end;
Do pole Edit1 se vypíše text „Potomek mluvi'“ a to i přesto, že je proměnná test typu TRodic.
procedure TForm1.Button1Click(Sender: TObject);
var test:TRodic;
begin
test:=TPotomek.Create;
Edit1.Text:=test.GetWay;
test.Free;
end;
Virtuální metody
Metody virtuální jsou označovány v deklaraci třídy jako virtual
procedure Test5; virtual;Na rozdíl od statických metod kompilátor negeneruje kód přímo pro volání konkrétní třídy, ale používá se mechanismu pozdního svázání. Metoda, která se bude volat, je určena až za běhu. Virtuální metoda může být v následnících předefinována (override). Při předefinování musí být deklarace přesně zachována (mění se pouze implementace).
procedure Test5; override;Pokud tedy kompilátor narazí na konstrukci Třída.VirtuálníMetoda, je možné, že byla metoda předefinována. Vygenerovaný kód musí za běhu nalézt v tabulce virtuálních metod správnou metodu a zavolat ji.
Příklad:
Definujeme si následující třídy:
type TRodic = class
function GetWay:string; virtual;
end;
type TPotomek = class(TRodic)
function GetWay:string; override;
end;
implementation
function TRodic.GetWay:string;
begin
result:='Rodic mluvi';
end;
function TPotomek.GetWay:string;
begin
result:='Potomek mluvi';
end;
Do pole Edit1 se vypíše text „Potomek mluvi'“ a to i přesto, že je proměnná test typu TRodic.
procedure TForm1.Button1Click(Sender: TObject);
var test:TRodic;
begin
test:=TPotomek.Create;
Edit1.Text:=test.GetWay;
test.Free;
end;
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 513
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved