Sunteți pe pagina 1din 14

POO – curs 11

- Informatică Economică, an II -

Clase interioare

Gheorghe Cosmin Silaghi


Clase interioare – definire (I)
Se definește o clasă nouă în interiorul unei clase existente
Tipul obiectului din clasa interioara se specifica precum: OuterClass.InnerClass
De obicei, clasa exterioara are o metoda care returnează un obiect din clasa inner
 In cazul nostru avem metodele getForwardSelector și getBackwardSelector

Obiectul din clasa interioara este legat la creare de un obiect existent din clasa exterioara
Obiectul din clasa interioară poate accesa toți membrii obiectului clasei exterioare fără
nevoie de calificare și indiferent de tipul de acces al acestora

Clasele interioare sunt potrivite pentru a implementa interfețe și astfel se realizează


ascunderea implementării
Clase interioare – definire (II)
Obiectul clasei interioare are un link (referinta) catre obiectul clasei exterioare care l-a creat
Pentru a se obtine referinta la obiectul clasei exterioare (din obiectul clasei interioare) se utilizeaza:
OuterType.this
Pentru a crea un obiect din clasa interioară pornind de la un obiect din clasa exterioară se poate utiliza:
obiectOuter.new

Clasele interioare pot fi create și intr-o metoda sau orice domeniu de vizibilitate deoarece:
 Se implementeaza o interfata, deci se poate crea si returna o referinta la aceasta (upcast)
 Se rezolva o problema complicata si dorim sa creem o clasa care sa ne ajute la rezolvarea problemei, dar nu
dorim ca aceasta sa fie publica
Clasa interioara poate fi accesata doar din interiorul metodei (sau domeniului de vizibilitate) unde a
fost definita
Clase interioare anonime
Sunt clase interioare fara nume (clase create direct la momentul utilizarii lor)
; finalizeaza construcția instrucțiunii care conține definitia clasei anonime
Campurile din clasele anonime pot fi initializate cu valori din afara (din domeniul unde se creaza
clasa)
Daca intr-o clasa anonima se doreste a fi utilizat un argument (sau o valoare) definita in afara
acesteia, atunci referinta acesteia trebuie sa fie final
Clasele anonime nu pot avea constructor, dar initializarile se pot realiza in blocul non-static de
initializare
Clasele interioare pot fi create static (nested classes) daca nu se doreste utilizarea referintei
obiectului exterior in interiorul clasei inner
Clasele interioare parte a unei interfete devin automat static public.
 Rol: crearea de cod comun care sa fie utilizat de toate implementarile interfetei
Oricat de adanca este imbricarea claselor nested, acestea pot accesa obiectele membre din
clasele exterioare, indiferent de nivelul de imbricare
De ce clase interioare?
Fiecare clasa interioară poate în mod independent sa mosteneasca de la o alta
implementare. Deci o clasa interioară nu este limitată de faptul că clasa exterioara
mosteneste sau nu din implementare

Facilitati obtinute prin exitenta claselor interioare:


1. Clasa interioara poate avea instante multiple, fiecare cu propria stare, care este independenta de starea
obiectului din clasa exterioara

2. O singura clasa exterioara poate avea mai multe clase interioare fiecare implementand aceasi interfata
sau mostenind din aceasi clasa in mai multe feluri

3. La momentul creerii obiectului din clasa interioară, acesta nu este legat de creerea obiectului din clasa
outer

4. Clasa interioară este o clasa total diferita de clasa exterioara, nu exista confuzie de tipul is-a
Template method
Rolul metodei abstracte din interfețe: să permită implementări multiple, care apoi pot sa aibă utilizari
multiple
Metoda template: o metodă dintr-o clasă care are o parte fixă (metodele stepOne, stepTwo si
stepThree) și o parte variabilă ( metoda abstracta templateMethod() - care se poate schimba de la un
apel la altul)
Partea variabilă se implementează în funcții abstracte (trebuie rescrise prin mostenire)
getTypes din PetCreator este exemplu de Template method
Exemplu template method
Design patternul Strategy
Partea variabilă din template method se abstractizeaza intr-o metodă a unei interfețe
Se decuplează contextul de utilizare a metodei variabile (numită strategie) de
implementarea acesteia
Strategia este element de input la crearea (sau modificarea) contextului
Se permite schimbarea la runtime a strategiei

=> Crearea unei metode care (in context) care are comportament diferit in functie de tipul
argumentului (adică strategia) care se prezinta la intrare.
 De obiciei, metoda contine o parte fixa care este apelata de fiecare data si o parte care

variază (strategia)
DP Strategy
Exemplul Procesor si clasa Apply
Procesor se creaza ca si o interfata, iar clasele care doresc sa faca parte din strategie
vor implementa interfata scrisa
va exista o cuplare foarte puternica intre metoda Apply.proces() si clasa Procesor,
deoarece metoda Apply.process() nu poate fi aplicata decat cu strategii (obiecte) din
ierarhia Procesor, si nicidecum altor obiecte din alte ierarhii
Design patternul Adapter
Ce se intampla in cazul in care dorim sa utilizam in strategie o clasa importata dintr-o bibliotecă?
De exemplu să utilizăm Apply.process() cu strategii din ierarhia Filter – care functionează pe alt
timp de obiecte procesate (de tip Waveform)
Soluție:
Design patternul Adapter: se scrie cod care preia la intrare interfata existenta (Filter) si care sa
produca interfata de care este nevoie in program
Clasa Adapter trebuie să fie plasată in ierharhia strategiei acceptate, in cazul nostru Processor
FilterAdapter face delegare: se apelează metoda process a ierarhiei Filter

Prin decuplarea interfetei de implementare se permite ca o interfata sa poată fi aplicată mai


multor implementari, deci codul devine mult mai facil de reutilizat
DP Factory Method
Rolul unei interfete: sa se permita implementari multiple pentru diverse clase
Design patternul Factory: in loc sa se apeleze un constructor in mod direct, pentru
crearea unui obiect se apeleaza o metoda de creere a obiectului dintr-o clasa Factory.
Clasa Factory implementeaza o interfata care specifica metoda de creere
Astfel, se poate schimba la runtime o implementare a unei functionalitati cu alta
DP Control Framework
Application framework: un set de clase proiectate sa rezolve un tip anume de problemă (design
patternul Template Method)
Pentru aplicarea application framework se mostenesc din clasele de baza si se schimba implementarea
prin overriding
Codul suprascris este cel care customizeaza solutia la cazul particular

Control framework: un tip particular de application framework prin care sistemul raspunde la
evenimentele generate (sistem event-driven) – de exemplu GUIs
In implementarea Control framework, inner class sunt utilizate pentru a exprima diversele actiuni
(metoda action)

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