Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
virtuale (unul singur pentru o clasã), care este un vector de pointeri. Un apel de metodã<br />
virtualã este tradus printr-un apel indirect prin adresa tabelului de metode virtuale, iar<br />
un apel de metodã nevirtualã este tradus printr-un apel la o adresã fixã, stabilitã de<br />
compilator pentru metoda respectivã.<br />
Altfel spus, adresa functiei apelate este stabilitã la compilare pentru orice metodã<br />
nevirtualã (“legare timpurie”), dar este stabilitã la executie pentru orice metodã<br />
virtualã (“legare târzie”). Functia virtualã este apelatã printr-un pointer (referintã);<br />
acel pointer trimite cãtre un obiect, iar acel obiect trimite cãtre tabelul de metode<br />
virtuale al clasei de care apartine si deci la implementarea specificã clasei respective.<br />
Functiile polimorfice (virtuale) au sens numai <strong>în</strong>tr-o ierarhie de clase (de tipuri).<br />
Metodele virtuale împreunã cu colectiile de pointeri la tipul generic “Object” permit<br />
realizarea de colectii generice, care pot reuni obiecte de orice tip si chiar de tipuri<br />
diferite <strong>în</strong>tr-o aceeasi colectie. Putem deci sã avem o singurã clasã “Array” pentru<br />
vectori de pointeri la obiecte, indiferent de tipul acestor obiecte, cu conditia ca el sã fie<br />
subtip al tipului “Object”. Clasa anterioarã “Int” aratã cã pentru a memora date de un<br />
tip primitiv <strong>în</strong>tr-un astfel de vector generic trebuie sã includem tipul primitiv <strong>în</strong>tr-o<br />
clasã derivatã din “Object” (operatie numitã si “boxing” ). In Java si C# existã clase<br />
anvelopã pentru toate tipurile de date primitive (char, int, long, float, double, s.a.) .<br />
Clase abstracte<br />
O superclasã poate fi atât de generalã <strong>în</strong>cât sã nu se poatã preciza implementarea<br />
unor metode, care pot fi <strong>în</strong>sã declarate ca tip, parametri si efect (ca mod de utilizare).<br />
Astfel de metode se numesc metode abstracte, iar o clasã cu metode abstracte este o<br />
clasã abstractã, care nu poate genera obiecte (nu se poate instantia).<br />
Rolul unei clase abstracte este numai acela de a servi ca bazã pentru derivarea altor<br />
clase, deci ca tip comun mai multor subtipuri.<br />
In C++ o metodã abstractã este o metodã virtualã purã, declaratã astfel:<br />
// metode virtuale pure (abstracte)<br />
virtual void print () =0; // nu este o atribuire, este un nod de declarare<br />
virtual int equals (Object *) =0;<br />
O metodã abstractã poate rãmâne abstractã <strong>în</strong>tr-o subclasã, sau poate fi definitã, cu<br />
acelasi tip si cu aceleasi argumente ca <strong>în</strong> superclasã.<br />
O metodã abstractã este altceva decât o metodã cu definitie nulã (fãrã efect) :<br />
// metode virtuale cu definitie nulã (neabstracte)<br />
virtual void print () { }<br />
virtual int equals (Object *) { }<br />
O metodã abstractã din superclasã trebuie implementatã <strong>în</strong>tr-o subclasã pentru a<br />
crea obiecte, iar aceastã obligatie poate fi verificatã de cãtre compilator. Compilatorul<br />
nu poate <strong>în</strong>sã verifica dacã o metodã cu definitie nulã <strong>în</strong> superclasã a fost sau nu<br />
redefinitã <strong>în</strong> subclase.