Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
BulgaraCeha slovacaCroataEnglezaEstonaFinlandezaFranceza
GermanaItalianaLetonaLituanianaMaghiaraOlandezaPoloneza
SarbaSlovenaSpaniolaSuedezaTurcaUcraineana

BiologieBudovaChemieEkologieEkonomieElektøinaFinanceFyzikální
GramatikaHistorieHudbaJídloKnihyKomunikaceKosmetikaLékaøství
LiteraturaManagementMarketingMatematikaObchodPoèítaèùPolitikaPrávo
PsychologieRùznéReceptySociologieSportSprávaTechnikaúèetní
VzdìláníZemìdìlstvíZemìpisžurnalistika

Polymorfismus a virtuální metody

poèítaèù



+ Font mai mare | - Font mai mic



DOCUMENTE SIMILARE

TERMENI importanti pentru acest document

Polymorfismus a virtuální metody

Polymorfismus



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

Pozn: V pøípadì, že chceme použít v potomkovi stejnojmennou metodu uvedenou v rodièovské tøídì, napíšeme pøed tuto metodu slovo inherited

type

TRodic = class

function GetWay:string; virtual;

end;

TPotomek = class(TRodic)

function GetWay:string; override;

end;

implementation

function TRodic.GetWay:string;

begin

result:='Rodic mluvi';

end;

function TPotomek.GetWay:string;

begin

result:=inherited GetWay + 'Potomek mluvi';

end;

// Do edit boxu se vypíše text Rodic mluviPotomek mluvi

procedure TForm1.Button1Click(Sender: TObject);

var test:TRodic;

begin

test:=TPotomek.Create;

Edit1.Text:=test.GetWay();

test.Free;

end Statická (brzká) vazba

Jedná se o vazbu, kdy pøekladaè již pøi pøekladu kódu ví, jaké metody budou kdy vyvolány. Tedy principielnì se jedná o to, že pøi volání metody potomka, která má stejné jméno jako metodu rodièe, dochází k volání metody rodièe a nikoliv potomka.

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 544
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2025 . All rights reserved