Administratie | Alimentatie | Arta cultura | Asistenta sociala | Astronomie |
Biologie | Chimie | Comunicare | Constructii | Cosmetica |
Desen | Diverse | Drept | Economie | Engleza |
Filozofie | Fizica | Franceza | Geografie | Germana |
Informatica | Istorie | Latina | Management | Marketing |
Matematica | Mecanica | Medicina | Pedagogie | Psihologie |
Romana | Stiinte politice | Transporturi | Turism |
Delphi limbaj orientat obiect
Pentru a scrie aplicatii simple in Delphi nu e necesara cunoasterea in detaliu a tuturor elementelor limbajului - de exemplu facilitatile avansate pentru tratarea exceptiilor - deoarece Delphi pregateste in mare parte codul necesar pentru programator. Totusi, pentru a intelege mai bine ce facem si pentru a stapini cu adevarat mediul Delphi, sint necesare aceste cunostinte. Delphi este o extensie a limbajului Pascal, principala sa facilitate fiind orientarea spre lucrul cu obiecte, motiv pentru care, in continuare, vom trata aceasta trasatura a limbajului.
Delphi foloseste o noua viziune asupra lucrului cu obiecte, fata de extensiile anterioare Pascal.
Termeni de baza
Termenii de baza folositi in lucrul cu obiecte sint "clasa" si "obiect".
"Clasa" = tip de data utilizator, care are o reprezentare, o stare si un comportament. Clasa contine date interne (de obicei ascunse) si subprograme. Datele interne descriu reprezentarea clasei, valorile concrete constituie starea unui obiect iar subprogramele descriu comportamentul. O clasa descrie un grup de entitati foarte asemanatoare. Fiind un tip de data, o clasa nu ocupa spatiu in memorie.
"Obiect" = o instanta a unei clase (o variabila de tipul descris de clasa). Obiectul corespunde unei entitati "reale". Un obiect ocupa spatiu de memorie in timpul executiei programului.
In unele limbaje cei doi termeni nu sint foarte clar diferentiati. Chiar versiunile anterioare de Pascal foloseau cuvintul rezervat object pentur a defini o clasa. De aceea programatorii Pascal sint obisnuiti sa foloseasca termenul de obiect in loc de clasa si instanta in loc de obiect.
O data cu introducerea cuvintului rezervat class pentru definirea claselor (in loc de object), Delphi a introdus si un nou model de lucru cu obiecte.
Diferenta intre cele 2 modele
Intre cele doua modele de lucru cu obiecte asemanarile sint foarte mari, mergind uneori pina la identitate. Ambele modele definesc clase de obiecte, ambele suporta modificatorii de acces la atribute si metode private, protected si public, ambele permit derivarea claselor prin mostenire. Codul scris este aproape identic pentru ambele modele.
Ceea ce difera este modul de implementare si comportamentul codului compilat. In modelul anterior se lucra cu obiecte statice, in timp ce in noul model se lucreaza cu obiecte dinamice. Aceasta implementare este numita "model referinta".
In modelul referinta, un obiect (ca variabila) nu contine date, ci este doar un pointer catre zona de memorie in care se afla datele obiectului (obiectul in sine).
Modelul referinta este foarte puternic si in acelasi timp usor de folosit, mai usor de folosit decit modelul static. Acest model de lucru cu obiecte este folosit si in limbaje strict orientate obiecte precum Eiffel.
Pentru compatibilitate, Delphi pastreaza si modelul static de lucru cu obiecte. In continuare ne vom ocupa numai de modelul referinta.
Declararea unei clase
In ierarhia de obiecte Delphi, TObject este clasa de baza, din care sint derivate toate celelalte. Orice clasa noua definita trebuie sa fie derivata din una existenta. Pentru o clasa complet noua de porneste de la clasa de baza, caz mai rar intilnit. Intrucit unul din scopurile claselor este refolosirea codului, mai mereu se porneste de la o clasa aflata pe un nivel oarecare al ierarhiei.
Pentru a defini o clasa in Delphi se procedeaza astfel:
- pentru o clasa complet noua:
type
TClasaNoua=class
end;
sau
type
TClasaNoua=class(TObject)
end;
Aceste doua forme sint echivalente. In primul caz derivarea se face implicit din clasa de baza TObject, in al doilea caz se face derivarea in mod explicit din clasa de baza.
- pentru a deriva dintr-o clasa existenta:
type
TClasaNoua=class(TClasaParinte)
end;
Faptul ca orice clasa este derivata direct sau indirect din TObject asigura implementarea modelului referinta si prezenta facilitatilor de baza in orice clasa.
Exemplu:
type
TNrComplex=class(TObject)
preala:real
pimag:real;
procedure seteaza(pr,pi:real);
function modul:real;
end;
Accesul la atributele unui obiect se face prin calificare:
var nrc:TNrComplex;
nrc.preala:=7.3;
nrc.pimag:=3.2;
Corpul metodelor trebuie descris in partea de cod. Pentru a marca apartenenta metodelor la clasa, numele lor trebuie calificat cu numele clasei din care fac parte:
procedure TNrComplex.Seteaza(pr,pi:real)
begin preala:=pr;
pimag:=pi;
end
function TNrComplex.Modul:real;
begin modul:=sqrt(preala*preala+pimag*pimag);
end
Apelarea metodelor se face prin calificare, asemanator cu accesarea atributelor:
var nrc:TNrComplex;
m:real;
nrc.Seteaza(7.3,3.2);
m:=nrc.modul;
Constructori si destructori
In exemplul anterior nrc este de fapt o referinta, conform modelului referinta de lucru cu obiecte. Prin declararea variabilei nrc nu a fost creat nici un obiect, doar s-a rezervat un spatiu in care sa fie retinuta ulterior adresa unui obiect de tip TNrComplex. (In modelul static de obiecte, prin declaratie s-ar fi creat un obiect).
Obiectul in sine trebuie creat explicit, prin apelarea constructorului sau.
Constructor = o metoda speciala, care creeaza un obiect (aloca memorie in heap pentru atributele obiectului).
Destructor = o metoda speciala care "sterge" obiectul din memorie (elibereaza zona de memorie ocupata de obiect).
Deoarece orice clasa este derivata de TObject, ea va contine un constructor si un destructor mostenite din aceasta clasa: Create respectiv Free.
Exemplu:
pentru ca exemplul anterior sa fie corect, inainte de a putea accesa atributele sau metodele obiectului, acesta trebuie creat. Atunci cind obiectul nu mai este necesar, el trebuie sters din memorie. Exemplul va arata astfel:
var nrc:TNrComplex;
m:real;
nrc.Create; //creare obiect
nrc.Seteaza(7.3,3.2); //utilizare obiect
m:=nrc.modul;
nrc.Free; //stergere obiect
Desi este corecta, clasa descrisa mai sus nu are functionalitate. Pentru a avea o functionalitate minima, trebuie adaugate citeva metode:
adaugarea unui numar complex,
scaderea unui numar complex,
inmultirea cu un numar complex,
inmultirea cu un numar real etc.
Din motive legate de usurinta in gestionarea codului si securitatea datelor, fiecare clasa se descrie intr-un unit separat (desi e posibila descrierea ei in orice alt unit).
In sectiunea de interfata a unit-ului se descrie clasa ca atare, iar in sectiunea de implementare se descriu metodele clasei.
Exemplu:
unit-ul care contine descrierea clasei TNrComplex,
o aplicatie simpla care foloseste clasa TNrComplex.
Constructori si destructori definiti de utilizator
Constructorul implicit face doar alocare de memorie pentru atributele clasei, fara a le initializa. Pentru multe aplicatii, e nevoie si de initializarea atributelor. In acest scop se poate scrie o noua versiune pentru constructorul implicit (override - inlocuirea lui) sau se poate scrie un constructor complet nou. Un constructor nou poate avea orice nume.
Exemplu: in clasa TNrComplex se adauga:
constructor Init(pr,pi:real);
constructor TNrConmplex.Init(pr,pi:real);
begin preala:=pr;
pimag:=pi;
end;
Prin apelarea acestui constructor se realizeaza atit alocarea de spatiu cit si initializarea atributelor.
Exemplu: nrc.init(7.3, 3.2);
Asemanator, se poate scrie un destructor care sa efectueze operatii specifice (de exemplu, daca avem clasa Lista simplu inlantuita, care are ca atribut capul listei, inainte de stergerea obiectului trebuie sterse toate nodurile listei - operatie care trebuie realizata in mod explicit de destructor).
Ascunderea atributelor/metodelor
Pentru o abordare orientata obiect corecta, atributele trebuie ascunse in interiorul clasei -incapsulate. Principalul scop al incapsularii este protejarea atributelor impotriva accesului neautorizat (inclusiv pentru a evita valorile care descriu stari aberante ale obiectelor).
Accesul la datele ascunse se face intermediul metodelor de acces (metode al caror scop este sa seteze sau sa citeasca valorile atributelor - de exemplu metoda Seteaza din exemplul anterior). In acest fel implementarea interna a clasei poate fi schimbata, fara a afecta in vreun fel aplicatiile elaborate pe baza ei.
In Delphi, incapsularea se realizeaza pe doua niveluri: la nivelul clasei si la nivelul unit-ului.
La nivelul clasei, incapsularea se realizeaza prin folosirea modificatorilor de acces. Delphi a imprumutat din C++ modificatorii private, protected si public. In plus, exista modificatorul published - cu rol special in Delphi - si automated, cu rol specific controalelor tip OLE.
private: atribute si metode care nu pot fi accesate din afara unit-ului de clasa (in C++ e mai strict, interzicind accesul din afara clasei).
public: atribute si metode accesibile liber, din orice sectiune de program in care este vizibil obiectul respectiv.
protected: atribute si metode partial protejate. Sint accesibile din clasa curenta si toti descendentii sai, dar nu pot fi accesate de utilizatorii clasei sau ai descendentilor sai (codul care instantiaza obiecte din clasele respective).
In principiu, atributele unei clase sint private iar metodele publice. Daca unele metode sint necesare doar pentru unele calcule interne clasei, atunci pot fi private sau protejate. Atributele pot fi publice atunci cind se doreste acces rapid si usor la ele si exista siguranta in privinta modului de definire si in privinta securitatii clasei.
Exemplu: atributele clasei TNrComplex devin private si se adauga metode pentru accesarea si setarea cimpurilor preala si pimag. Se adauga si o metoda care intoarce valoarea complexa reprezentata ca sir de caractere.
published: atribute si metode publice disponibile si in timpul dezvoltarii aplicatiei. Ele sint accesibile mediului Delphi si apar in Inspectorul de obiecte in timpul dezvoltarii aplicatiei. Folosirea modificatorului published este importanta atunci cind se dezvolta componente Delphi si mai putin importanta atunci cind se dezvolta aplicatii.
Daca in descrierea clasei nu se precizeaza nici un modificator, atunci implicit atributele si metodele sint published.
automated: folosit pentru a defini interfata publica cu informatii tip automatizare OLE a unor clase. E folosita in clasele derivate din TAutoClass, pentru a crea servere de automatizare OLE.
Observatie: atunci cind se construieste o interfata Delphi, atributele corespunzatoare elementelor de interfata trebuie sa fie publicate pentru a putea fi initializate automat (Delphi le plaseaza in sectiunea implicita - published). De asemenea, procedurile care raspund evenimentelor trebuie sa fie publicate. Numai elementele publicate apar in Inspectorul de obiecte.
La nivelul unui unit incapsularea se manifesta prin restrictiile de acces impuse de sectiunile acestuia: interfata si implementare. Doar ceea ce este descris in sectiunea de interfata este vizibil din afara unit-ului, restul fiind protejat, ascuns in interior.
Acest document nu se poate descarca
E posibil sa te intereseze alte documente despre:
|
Copyright © 2024 - Toate drepturile rezervate QReferat.com | Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site. { Home } { Contact } { Termeni si conditii } |
Documente similare:
|
ComentariiCaracterizari
|
Cauta document |