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: 513
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 2024 . All rights reserved