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:09]
Adriana Draghici [Obiective]
laboratoare:clase-abstracte-interfete [2019/10/28 18:11] (current)
Ion Bîrsu [Resurse]
Line 2: Line 2:
  
 == Obiective == == Obiective ==
-Scopul acestui laborator este prezentarea conceptelor de **interfață** și de **clasă abstractă** în limbajul Java.+Scopul acestui laborator este prezentarea conceptelor de **interfață** și de **clasă abstractă** ​și utilizarea lor în limbajul Java
 + 
 +Conceptele de metode și clase abstracte și de interfețe sunt prezente și în alte limbaje OOP, fiecare cu particularitățile lor de sintaxă. E important ca în urma acestui laborator să înțelegeți ce reprezintă și situațiile în care să le folosiți.
  
 Aspectele urmărite sunt: Aspectele urmărite sunt:
-* Prezentarea ​și utilizarea ​interfețelor și claselor abstracte+* Prezentarea interfețelor și claselor abstracte
 * Moștenirea în cazul interfețelor si claselor abstracte * Moștenirea în cazul interfețelor si claselor abstracte
-* Diferențele dintre interfețe și clase abstracte ​și înțelegerea situațiilor în care să le folosiți+* Diferențele dintre interfețe și clase abstracte
  
 == Introducere == == Introducere ==
Line 56: 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 110: 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 221: 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 235: 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.1534000187.txt.gz · Last modified: 2018/08/11 18:09 by Adriana Draghici