Differences

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

Link to this comparison view

poo-ca-cd:laboratoare:clase-abstracte-interfete [2020/11/08 19:23]
florin.mihalache [Exerciţii]
poo-ca-cd:laboratoare:clase-abstracte-interfete [2024/11/03 19:59] (current)
alexandru.sima1512 [Exerciţii] Adăugat cerințe pt. exercițiile din 2024
Line 1: Line 1:
-===== Abstractizare =====+===== Laboratorul 5: Abstractizare =====
  
 **Video introductiv:​** [[https://​www.youtube.com/​watch?​v=R9KO-GHbNUA|link]] **Video introductiv:​** [[https://​www.youtube.com/​watch?​v=R9KO-GHbNUA|link]]
Line 48: Line 48:
 Pentru a exprima faptul că o metodă este abstractă (adică se declară doar interfaţa ei, nu și implementarea),​ Java folosește cuvântul cheie ''​abstract'':​ Pentru a exprima faptul că o metodă este abstractă (adică se declară doar interfaţa ei, nu și implementarea),​ Java folosește cuvântul cheie ''​abstract'':​
 <code java>​abstract void f();</​code>​ <code java>​abstract void f();</​code>​
-O clasă care conţine **metode abstracte** este numită **clasă abstractă**. Dacă o clasă are una sau mai multe metode abstracte atunci ea trebuie să conţină în definiţie cuvântul ''​abstract''​.+O clasă care conţine **metode abstracte** este numită **clasă abstractă**. Dacă o clasă are una sau mai multe metode abstracteatunci ea trebuie să conţină în definiţie cuvântul ''​abstract''​.
  
 Exemplu: Exemplu:
Line 232: Line 232:
  
 ==== Exerciţii ====  ==== Exerciţii ==== 
-1. (**2p**) Implementaţi interfaţa ''​Task'' ​(din pachetul ''​first''​) ​în cele 3 moduri de mai jos. +<note important>​ 
-  * Un task care să afișeze un mesaj la output. Mesajul este specificat în constructor. (''​OutTask.java''​) +Pentru a încărca soluția, va trebui să accesați link-ul https://​code.devmind.ro/​login,​ să intrați pe tab-ul Contests, unde veți găsi laboratorul grupei voastre. 
-  * 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''​).+</​note>​ 
 + 
 +1. (**2 puncte**) Implementaţi interfaţa ''​Task''​ în cele 3 moduri de mai jos: 
 +  * Un task (''​OutTask.java''​) ​care să afișeze un mesaj la output. Mesajul este specificat în contructorul clasei. 
 +  * Un task (''​RandomOutTask.java''​) care genereaza ​un număr aleator ​de tip ''​int'' ​și afișeaza un mesaj cu numărul generat la output. Generarea se va realiza ​în constructor ​utilizandu-se o instanță globală a unui obiect de tip [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Random.html#​Random-long-|Random]] care a fost inițializat cu seed-ul **12345**. 
 +  * Un task (''​CounterOutTask.java''​) care incrementeaza ​un contor global și afișează valoarea contorului după fiecare incrementare. ​
  
 <​note>​**Notă**:​ Acesta este un exemplu simplu pentru [[http://​en.wikipedia.org/​wiki/​Command_pattern|Command Pattern]]</​note>​ <​note>​**Notă**:​ Acesta este un exemplu simplu pentru [[http://​en.wikipedia.org/​wiki/​Command_pattern|Command Pattern]]</​note>​
Line 241: Line 246:
 {{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex1.png?​600|}} {{:​poo-ca-cd:​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. (**3 puncte**) Interfaţa ''​Container''​ specifică interfaţa comună pentru colecţii de obiecte Task, în care se pot adăuga și din care se pot elimina elemente. ​
-  - (**1.5p**) ''​Stack''​ - care implementează o strategie de tip [[https://​en.wikipedia.org/​wiki/​Stack_(abstract_data_type)|LIFO]] +
-  - (**1.5p**) ''​Queue''​ - care implementează o strategie de tip [[https://​en.wikipedia.org/​wiki/​Queue_(abstract_data_type)|FIFO]]+
  
-**Bonus**: Incercați să evitaţi codul similar în locuri diferite!+Interfața conține metodele:  
 +  ​''​pop():​Task''​ 
 +  ​''​push(Task):​void''​ 
 +  ​''​size():​int''​ 
 +  ​''​isEmpty():boolean''​ 
 +  * ''​transferFrom(Container):​void''​
  
-<note tip>​**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. +Creaţi două tipuri ​de containere care implementează această clasă: 
- <code java> +  * ''​Stack''​ - care implementează o strategie de tip [[https://en.wikipedia.org/wiki/Stack_(abstract_data_type)|LIFO]] 
-ArrayList<​Task>​ list = new ArrayList<​Task>​();​ +  * ''​Queue''​ - care implementează o strategie de tip [[https://en.wikipedia.org/wiki/Queue_(abstract_data_type)|FIFO]] 
-</​code></​note>​+ 
 +**Bonus**: Incercați să evitaţi codul similar în locuri diferite!
  
 {{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex2.png?​600|}} {{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex2.png?​600|}}
  
-/* +3. (**2 puncte**) Creaț4 interfețe: ​''​Minus''​''​Plus'', ​ ''​Mult'',​ ''​Div''​ care conțin câte o metodă ​aferentă numelui ​ce are ca argument ​un număde tipul float.
-3. (**2p**)  +
-Implementaţ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)+
  
-<note important>​**Evitaţi** instanţierea clasei Factory implementate de voi la fiecare creare ​unui container!</note+Spre exemplu interfaț''​Minus''​ va declara metoda: 
- +<code java
-<note>**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 ​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]].</​note>​+void minus(float value); 
 +</code> 
 +Scrieți clasa ''​Operation'' ​care să implementeze toate aceste interfețe. Pe lânga metodele interfețelor implementate aceasta va conține: 
 +  * un câmp ''​number'' ​de tipul ''​float''​ asupra căruia se vor efectua operațiile implementate 
 +  * metodata getter ''​getNumber'' ​care va returna valoarea câmpului ''​value''​ 
 +  * un constructor ​care primește ca parametru valoarea inițială pentru ​campul ''​value''​
  
-{{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex3.png?250|}}+Pentru cazul în care metoda div este apelată cu valoare 0 operația nu va fi efectuată și se va afișa mesajul "​Division by 0 is not possible"​.
  
-4. (**3p**) Extindeţi clasa ''​AbstractTaskRunner'' ​(din pachetul ''​fourth''​) în 3 moduri: +4. (**3 puncte**) Implementaţi clasa ''​Song''​ și clasa abstracta ​''​Album''​.
-  * (**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**) ''​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. +
-{{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex4.png?​650|}} +
-*/+
  
-3. (**2p**) În pachetul ​''​third'' ​creați 4 interfețe: ​''​Minus''​''​Plus''​,  ​''​Mult''​''​Div''​ care conțin câte o metodă aferentă numelui ce are ca argument un numar de tipul float. Scriețclasa ''​Operation''​ care să implementeze toate aceste interfețe și care are un câmp de tipul float ce va fi modificat de fiecare metodă implementată de voi.+Song: 
 +  ​stochează atributele ​''​name'' ​de tip ''​String''​''​id'' ​de tip ''​int'' ​si ''​composer'' ​de tip ''​String''​ 
 +  * are un constructor ​care va inițializa atributele specificate anterior 
 +  * implementează metodele ​de tip getter șsetter pentru fiecare atribut 
 +  * suprascrie metoda ​''​toString()''​ care va returna ​un ''​String'' ​de forma "​Song{name=''​name'',​ id=''​id'',​ composer=''​composer''​}"​
  
-4. (**3p**) În pachetul ''​fourth''​ scrieți clasa ''​Song''​ ce are ca atribute: ''​name''​(String),​ ''​id''​(int),​ ''​composer''​(String) și clasa abstractă ''​Album''​ care are o listă de cântece ​(puteți folosi ArrayList) ​metoda abstractă ​''​addSong'' ​și metodele neabstracte ''​removeSong'', ​''​toString''​. Apoi, creați clasele ​''​DangerousAlbum'', ​''​ThrillerAlbum''​''​BadAlbum''​ care să moștenescă clasa ''​Album''​''​DangerousAlbum''​ conține doar melodii cu id-ul număr prim, ''​ThrillerAlbum''​ conține melodii scrise doar de ''​Michael Jackson''​ și au id-ul număr par iar clasa ''​BadAlbum''​ conține doar melodii care au nume de 3 litere și id număr palindrom.+Album: 
 +  ​stochează o listă de cântece ​ 
 +  * declară ​metoda abstractă ​numită ​addSong ​care primește un Song și nu returnează nimic 
 +  * implementează metoda ​removeSong ​care primește un song și nu returnează nimic 
 +  * suprascrie metoda ​''​toString()'' ​care va returna un ''​String'' ​de forma "​Album{songs=[SongSong, ...]}"
  
-==== Resurse ====+După implementarea claselor ''​Song''​ și ''​Album'',​ creați clasele ''​DangerousAlbum'',​ ''​ThrillerAlbum''​ și ''​BadAlbum'',​ care vor moșteni clasa ''​Album''​ și vor implementa metoda ''​addSong''​ după următoarele reguli: 
 +  * ''​DangerousAlbum''​ conține doar melodii cu id-ul număr prim 
 +  * ''​ThrillerAlbum''​ conține melodii scrise doar de ''​Michael Jackson''​ și au id-ul număr par 
 +  * ''​BadAlbum''​ conține doar melodii care au nume de 3 litere și id număr palindrom
  
-  * {{:​poo-ca-cd:​laboratoare:​schelet.zip|}} +În cazul în care criteriul de adăugare specific unui album nu este respectat, melodia nu va fi adaugată în acesta
- /* * {{:​poo-ca-cd:​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>​ */+
  
poo-ca-cd/laboratoare/clase-abstracte-interfete.1604856239.txt.gz · Last modified: 2020/11/08 19:23 by florin.mihalache
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0