Sunteți pe pagina 1din 4

2.4.

Generalizare şi instanţă

2.4.1. Generalizare şi specializare

Ca tipuri abstracte care oferă relaţii despre subtipuri, clasele pot fi organizate după o
relaţie de generalizare sau relaţia este 0. Se poate vorbi de graful clasei sau de graful moştenit,
căci această relaţie este la baza moştenirii. Rezultă modele de date semantice, generalizabile care
sunt utile pentru clasificarea obiectelor în funcţie de punctele lor comune (generale) şi de
specificul aceluiaşi graf.
Generalizarea este funcţia care are o clasă (subclasă) la origine, şi face corespondenţa cu o
clasă (subclasă) mai generală.
Procesul de generalizare este unul de descoperire; fiind dată o clasă numai după un
anumit timp putem descoperi dacă există o posibilă superclasă a acesteia şi care sunt proprietăţile
acestei clase.
Funcţia inversă generalizării este specializarea, deci fiecare clasă are anumite
caracteristici specifice subclaselor, permiţând adăugarea de proprietăţi specifice (specializate) pe
o anumită subclasă.
Fiind dată o clasă A, putem construi specializarea B a acesteia, care va conţine toate
proprietăţile lui A (stări şi operaţii), dar care va conţine şi stări şi operaţii proprii. Spunem acum
că există o relaţie de moştenire între clasa B şi clasa A, relaţie numită, deseori ESTE, şi spunem
că B este o specializare a lui A. Aceasta înseamnă că fiecare instanţă a lui B se comportă ca şi
când ar fi o instanţă a lui A. Procesul de specializare este unul de inventare; noi pornind cu o
singură clasă dată, o îmbogăţim progresiv, obţinând în cele din urmă mai multe versiuni ale
acesteia.
Exemple:
- un angajat cu ora ESTE un angajat;
- un proiect intern ESTE un proiect;
- un cititor ESTE o persoană.
Legătura ESTE a fost utilizată pentru reprezentarea unui domeniu de entităţi, de exemplu
concepte, descrieri, propoziţii, individualizări şi prototipuri. Scopul este de a arăta diferite variaţii
posibile bazate pe ierarhiile ESTE. În general, legătura ESTE se stabileşte între nodurile unei
ierarhii.
Legătura ESTE poate însemna oricare din variantele:
 Relaţii între submulţimi/supermulţimi, caz în care nodurile reprezintă mulţimi;
 Generalizare/specializare. Generalizarea exprimă o relaţie între predicate.
Un tip de, este foarte asemănătoare cu generalizarea, dar implică tipul nodurilor pe care le
conectează (un manager este un angajat, un şarpe este o reptilă). În majoritatea cazurilor, legătura
un tip de este abstractă în sensul că nu pot fi create instanţe de acest tip. De exemplu, nu este
posibil să identificăm o reptilă anume ci numai cazuri speciale cum ar fi şarpele sau iguana.
Conţinutul conceptual, aceasta exprimând faptul că o descriere include o alta (relaţia “un
dreptunghi este un poligon” este echivalentă cu “un dreptunghi este un poligon cu patru laturi”.
Restricţia valorii rolului (exemplu un manager este un angajat cu salariu mare). În cadrul
ei nu se vor face referiri la supertipuri sau subtipuri.
În acelaşi timp, este posibil să avem relaţii generice/individuale, acestea numindu-se
instanţieri.
2.4.2. Instanţierea obiectelor

Instanţa poate fi definită ca legătura dintre un obiect şi clasa sa de apartenenţă care i-a
permis crearea.
Elementele care aparţin colecţiei de obiecte descrise într-o clasă se numesc instanţe de
clasă.
În dicţionarul limbii engleze, instanţa este definită ca fiind un caz sau un exemplar.
Orice obiect creat este o instanţă a clasei părinte. De aceea, procesul creării obiectului este
numit instanţiere. Dacă se va crea o altă instanţă a obiectului, ea va fi identică cu prima, singura
diferenţă este că titlul celei de-a doua instanţă are un număr de secvenţă diferit de prima, în rest
ambele ferestre sunt identice.
În fig.2.10. dăm un exemplu de graf de instanţă care arată relaţia obiect-clasă.

Angajaţi

Ionescu Popescu Olaru

Fig.2.10. Graful instanţierii

Pentru a afişa orice instanţă a unei proprietăţi, se foloseşte următoarea sintaxă:

?<nume obiect>.<nume proprietate>

Distorsiunea dintre obiecte şi clase este mai pregnantă la limbaje cu compilatoare de


exemplu C++. În acest timp ea obligă programatorul să trateze clasele ca tipuri; modificarea unei
clase conducând la modificări în definirea sa.
Situaţiile de instanţiere posibile sunt:
 Incluziune de mulţime, caz în care un element particular aparţine unei mulţimi;
 Predicate, cu ajutorul cărora se menţionează dacă un individ este membru al unei mulţimi
generice;
 Conţinutul conceptual, acesta realizând legătura între un nod şi genericul său;
 Abstractizare, este o relaţie care pleacă de la individ la generic. În acest caz, este construit
tipul generic, iar departamentul este tipul corespunzător. Această situaţie apare în mod
frecvent în cadrul analizei unui text în limbajul natural în scopul identificării principalelor
abstractizări şi concepte.
Reprezentarea grafică corespunzătoare este a unui arc orientat spre subclasă (apelând
deci o clasă inferioară) situată sub superclasă (clasă superioară). Fig.2.3. arată un graf de clase în
care de exemplu Personal este superclasa Angajaţilor şi Studenţi; Studenţi este subclasa lui
Personal etc., generali-zarea este reprezentată în mod natural prin logică.
Relaţia este tranzitivă: o superclasă a unei clase este de asemenea o superclasă la
subclasele sale. De exemplu Studenţi este o subclasă a Personalului. O subclasă poate avea mai
mult de o superclasă imediată ca de exemplu Absolvenţi care este o subclasă a Cercetătorilor şi a
Studenţilor. Putem spune deci, că obiectele care aparţin subclaselor au proprietăţile subclaselor
dar în acelaşi timp şi pe cele ale superclasei.
Personal

Angajaţi Studenţi

Ingineri Cercetători

Absolvenţi

Fig.2.11. Graful generalizării

Definirea unei subclase se face simplu la definirea clasei precizându-se superclasele


directe (fig.2.12.)

Clasa Angajaţi superclasa Personal


<definirea proprietăţilor unui angajat>
Clasa cercetători superclasa Angajaţi
<definirea proprietăţilor unui cercetător>
Clasa Absolvenţi superclasa Cercetători, Studenţi
<definirea proprietăţilor unui stagiar>

Fig.2.12. Definirea subclaselor

Pentru a putea manipula clasele ca pe obiecte prin aceleaşi mecanisme, de exemplu


trimiterea de mesaje, se face putând genera clase ca obiecte, astfel spus instanţe de clase.
Conceptul de metaclasă răspunde acestor cerinţe.
Limbajele total obiect conduc la considerarea unei clase ca un obiect. Aceasta prezintă
avantajul posibilităţii trimiterii unui mesaj la o clasă, de exemplu pentru crearea sau distrugerea
unui obiect din acea clasă. Problema care se pune este definirea clasei dintr-o clasă. Răspunsul
clasic este apelarea la metaclase. O clasă, este instanţa metaclasei sale, altfel spus descriptorul
unei clase este un obiect în metaclasă. Acest lucru prezintă o multitudine de avantaje:
 constructorul poate apărea ca o metodă a metaclasei (New),
 variabilele de instanţă ale metaclasei pot fi definite permiţându-se precizarea structurii
clasei instanţiate,
 pot fi administrate variabilele clasei.
Variabilele clasei sunt proprietăţi partajate către toate instanţele unei clase, comune
tuturor obiectelor clasei.
Fie de exemplu un contor de instanţă, un cronometru global. Acesta este foarte util pentru
factorizarea elementelor comune obiectelor care vor fi generate pentru tratarea acestor variabile,
de exemplu pentru calculul numărului de instanţe, sau avansarea cronometrului.
Limbajul este mai suplu şi fiecare clasă poate fi particularizată la nivelul metaclasei sale.
În limbajele total obiect cu metaclase, problema clasei dintr-o clasă este recursivă. O
metaclasă este un obiect, însă se pune întrebarea care este atunci clasa sa? La această întrebare
pot exista două răspunsuri în funcţie de tipul sistemului:
 în sistemele închise cum este Smalltalk, metaclasele sunt create de sistem şi nu
sunt administrate de utilizatori; clasa metaclasei este o metaclasă particulară
intitulată Metaclass; această metaclasă este instanţa ei însăşi.
 în sistemele deschise cum este ObjVslip, utilizatorul poate crea propriile
metaclase. O metaclasă poate fi atunci o clasă particulară, problema fiind de
determinare a clasei acestei clase particulare; în scopul eliminării recursiunii
sistemul generează o clasă Class care este metaclasa ultimei clase şi care permite
generarea metaclaselor.
Metaclasa este clasa generată de clase (instanţele acestora), regrupate în particular prin
metodele aplicabile în clase şi structurile datelor comune la toate clasele.
Metodele aplicate claselor sunt crearea şi distrugerea instanţelor, şi operaţiile de evoluţie
a structurilor ca adăugarea sau suprimarea de atribute.
Pentru evitarea unei regresii infinite pentru crearea unei metaclase, se admite propria sa
instanţă. Este astfel uşor de generalizat noţiunea de clasă şi de metaclasă pentru o clasă unică,
clasa Obiect, care devine astfel rădăcina grafului pe clase.
Clasa Obiect furnizează câteva proprietăţi comune tuturor obiectelor (identificator,
metode New, metode Delete etc).
În fig.2.13. se ilustrează conceptul de metaclasă cu clasele Obiect şi Clasa (ca generatoare
de clasă).

Obiect
Este un format din

Instanţă
Angajaţi Clasa

Fig.2.13. Metaclasa
Ingineri
Este indicată existenţa a două tipuri de relaţii între aceste clase (generalizare şi instanţă)
care sunt ele însăşi obiecte.
Clasa Clasa este în primul rând o subclasă a clasei Obiect şi o instanţă a ei însăşi.

S-ar putea să vă placă și