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: 544
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2025 . All rights reserved