17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!