User Tools

Site Tools


Problem constructing authldap
laboratoare:clase-abstracte-interfete
Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:clase-abstracte-interfete [2018/08/11 18:23]
Adriana Draghici [Obiective]
laboratoare:clase-abstracte-interfete [2019/10/28 18:11] (current)
Ion Bîrsu [Resurse]
Line 58: Line 58:
 Interfeţele duc conceptul abstract un pas mai departe. Se poate considera că o interfaţă este o **clasă abstractă pură**: permite programatorului să stabilească o "​formă"​ pentru o clasă (numele metodelor, lista de argumente, valori întoarse), dar fară **nicio implementare**. O interfaţă poate conţine câmpuri dar acestea sunt în mod implicit **static** și **final**. Metodele declarate în interfață sunt în mod implicit **public**. Interfeţele duc conceptul abstract un pas mai departe. Se poate considera că o interfaţă este o **clasă abstractă pură**: permite programatorului să stabilească o "​formă"​ pentru o clasă (numele metodelor, lista de argumente, valori întoarse), dar fară **nicio implementare**. O interfaţă poate conţine câmpuri dar acestea sunt în mod implicit **static** și **final**. Metodele declarate în interfață sunt în mod implicit **public**.
  
-Interfaţa este folosită pentru a descrie un contract între clase: o clasă care implementează o interfaţă va implementa metodele definite în interfaţă. Astfel orice cod care folosește o anumită interfaţă știe ce metode pot fi apelate pentru aceasta.+Interfaţa este folosită pentru a descrie un **contract** între clase: o clasă care implementează o interfaţă va implementa metodele definite în interfaţă. Astfel orice cod care folosește o anumită interfaţă știe ce metode pot fi apelate pentru aceasta.
  
 Pentru a crea o interfaţă folosim cuvântul cheie **interface** în loc de **class**. La fel ca în cazul claselor, interfaţa poate fi declarată ''​public''​ doar dacă este definită într-un fișier cu același nume ca cel pe care îl dăm acesteia. Dacă o interfaţă nu este declarată ''​public''​ atunci specificatorul ei de acces este ''​package-private''​. Pentru a crea o interfaţă folosim cuvântul cheie **interface** în loc de **class**. La fel ca în cazul claselor, interfaţa poate fi declarată ''​public''​ doar dacă este definită într-un fișier cu același nume ca cel pe care îl dăm acesteia. Dacă o interfaţă nu este declarată ''​public''​ atunci specificatorul ei de acces este ''​package-private''​.
Line 112: Line 112:
 </​code>​ </​code>​
  
-Un exemplu pentru o interfeță care extinde mai multe interfețe:+Un exemplu pentru o interfață care extinde mai multe interfețe:
  
 <code java> <code java>
Line 223: Line 223:
  
 == Exerciţii ==  == Exerciţii == 
-1. (**2p**) Implementaţi interfaţa ''​Task''​ (din pachetul ''​first''​) în cele 3 moduri de mai jos. La crearea claselor în Eclipse, utilizaţi interfaţa vizuală pentru precizarea interfeţelor ce se doresc implementate (metodele corespunzătoare vor fi adăugate automat).+1. (**2p**) Implementaţi interfaţa ''​Task''​ (din pachetul ''​first''​) în cele 3 moduri de mai jos.
 * Un task care să afișeze un mesaj la output. Mesajul este specificat în constructor. (''​OutTask.java''​) * Un task care să afișeze un mesaj la output. Mesajul este specificat în constructor. (''​OutTask.java''​)
 * Un task care generează un număr aleator și afișează un mesaj cu numărul generat la output. Generarea se face în constructor. (''​RandomOutTask.java''​) * Un task care generează un număr aleator și afișează un mesaj cu numărul generat la output. Generarea se face în constructor. (''​RandomOutTask.java''​)
 * Un task care incrementează un contor global și afișează valoarea contorului după fiecare incrementare (''​CounterOutTask.java''​).**Notă**:​ Acesta este un exemplu simplu pentru [[http://​en.wikipedia.org/​wiki/​Command_pattern|Command Pattern]] * Un task care incrementează un contor global și afișează valoarea contorului după fiecare incrementare (''​CounterOutTask.java''​).**Notă**:​ Acesta este un exemplu simplu pentru [[http://​en.wikipedia.org/​wiki/​Command_pattern|Command Pattern]]
  
-{{:​laboratoare:​clase-abstracte-interfete:​ex1.png|}}+{{:​laboratoare:​clase-abstracte-interfete:​ex1.png?600|}}
  
 2. (**3p**) Interfaţa ''​Container''​ (din pachetul ''​second''​) specifică interfaţa comună pentru colecţii de obiecte Task, în care se pot adăuga și din care se pot elimina elemente. Creaţi două tipuri de containere care implementează această clasă: 2. (**3p**) Interfaţa ''​Container''​ (din pachetul ''​second''​) specifică interfaţa comună pentru colecţii de obiecte Task, în care se pot adăuga și din care se pot elimina elemente. Creaţi două tipuri de containere care implementează această clasă:
Line 237: Line 237:
 **Evitaţi codul similar** în locuri diferite! **Evitaţi codul similar** în locuri diferite!
  
-**Hint**: Puteţi reţine intern colecţia de obiecte, utilizând clasa [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​ArrayList.html|ArrayList]] din biblioteca ​Java, ce va fi folosită asemănător clasei ''​MyArrayList''​ din ''​Laborator 2''​. Iată un exemplu de iniţializare pentru șiruri:+**Hint**: Puteţi reţine intern colecţia de obiecte, utilizând clasa [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​ArrayList.html|ArrayList]] din SDK-ul ​Java. Iată un exemplu de iniţializare pentru șiruri:
  <​code java>  <​code java>
 ArrayList<​String>​ list = new ArrayList<​String>​();​ ArrayList<​String>​ list = new ArrayList<​String>​();​
 </​code>​ </​code>​
  
-{{:​laboratoare:​clase-abstracte-interfete:​ex2.png|}}+{{:​laboratoare:​clase-abstracte-interfete:​ex2.png?600|}}
  
 3. (**2p**) Implementaţi interfaţa ''​IFactory''​ (clasa ''​ContainerFactory'',​ din pachetul ''​third''​) care conţine o metodă ce primește ca parametru o strategie (enum ''​Strategy''​) și care întoarce un container asociat acelei strategii. Din acest punct înainte, în programul vostru veţi crea containere folosind doar această clasă (nu puteţi crea direct obiecte de tip Stack sau Queue). **Evitaţi** instanţierea clasei Factory implementate de voi la fiecare creare a unui container! 3. (**2p**) Implementaţi interfaţa ''​IFactory''​ (clasa ''​ContainerFactory'',​ din pachetul ''​third''​) care conţine o metodă ce primește ca parametru o strategie (enum ''​Strategy''​) și care întoarce un container asociat acelei strategii. Din acest punct înainte, în programul vostru veţi crea containere folosind doar această clasă (nu puteţi crea direct obiecte de tip Stack sau Queue). **Evitaţi** instanţierea clasei Factory implementate de voi la fiecare creare a unui container!
 **Notă**:​Acest mod de a crea obiecte de tip Container elimină problema care apare în momentul în care decidem să folosim o implementare diferită pentru un anumit tip de strategie și nu vrem să facem modificări și în restul programului. De asemenea o astfel de abordare este utilă când avem implementări care urmăresc scopuri diferite (putem avea un Factory care să creeze containere optimizate pentru viteză sau un Factory cu containere ce folosesc minimum de memorie). șablonul acesta de programare poartă denumirea de [[http://​en.wikipedia.org/​wiki/​Factory_method_pattern|Factory Method Pattern]]. **Notă**:​Acest mod de a crea obiecte de tip Container elimină problema care apare în momentul în care decidem să folosim o implementare diferită pentru un anumit tip de strategie și nu vrem să facem modificări și în restul programului. De asemenea o astfel de abordare este utilă când avem implementări care urmăresc scopuri diferite (putem avea un Factory care să creeze containere optimizate pentru viteză sau un Factory cu containere ce folosesc minimum de memorie). șablonul acesta de programare poartă denumirea de [[http://​en.wikipedia.org/​wiki/​Factory_method_pattern|Factory Method Pattern]].
  
-{{:​laboratoare:​clase-abstracte-interfete:​ex3.png|}}+{{:​laboratoare:​clase-abstracte-interfete:​ex3.png?250|}}
  
 4. (**3p**) Extindeţi clasa ''​AbstractTaskRunner''​ (din pachetul ''​fourth''​) în 3 moduri: 4. (**3p**) Extindeţi clasa ''​AbstractTaskRunner''​ (din pachetul ''​fourth''​) în 3 moduri:
-* (**1p**) ''​PrintTimeTaskRunner''​ - care afișează un mesaj după execuţia unui task în care se specifică ora la care s-a executat task-ul (vezi clasa [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Calendar.html|Calendar]]).+* (**1p**) ''​PrintTimeTaskRunner''​ - care afișează un mesaj după execuţia unui task în care se specifică ora la care s-a executat task-ul (vedeți ​clasa [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Calendar.html|Calendar]]).
 * (**1p**) ​ ''​CounterTaskRunner''​ -  incrementează un contor local care ţine minte câte task-uri s-au executat. * (**1p**) ​ ''​CounterTaskRunner''​ -  incrementează un contor local care ţine minte câte task-uri s-au executat.
 * (**1p**) ''​RedoBackTaskRunner''​ - salvează fiecare task executat într-un container în ordinea inversă a execuţiei și are o metodă prin care se permite reexecutarea task-urilor. * (**1p**) ''​RedoBackTaskRunner''​ - salvează fiecare task executat într-un container în ordinea inversă a execuţiei și are o metodă prin care se permite reexecutarea task-urilor.
  
-{{:​laboratoare:​clase-abstracte-interfete:​ex4.png|}}+{{:​laboratoare:​clase-abstracte-interfete:​ex4.png?650|}}
 == Resurse == == Resurse ==
  
-* {{laboratoare:​clase-abstracte-interfete:​lab4_schelet_revised.zip|Schelet}}+* {{laboratoare:​clase-abstracte-interfete:​lab4_schelet.zip|Schelet}} 
 +* {{:​laboratoare:​clase-abstracte-interfete:​|Soluție}}
 * <​html><​a class="​media mediafile mf_pdf"​ href="/​poo/​laboratoare/​clase-abstracte-interfete?​do=export_pdf">​PDF laborator</​a></​html>​ * <​html><​a class="​media mediafile mf_pdf"​ href="/​poo/​laboratoare/​clase-abstracte-interfete?​do=export_pdf">​PDF laborator</​a></​html>​
-* **{{:​laboratoare:​clase-abstracte-interfete:​ clase-abstracte-interfete-sol.zip | Soluție}}** 
  
laboratoare/clase-abstracte-interfete.1534001023.txt.gz · Last modified: 2018/08/11 18:23 by Adriana Draghici