Differences

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

Link to this comparison view

poo-ca-cd:laboratoare:clase-abstracte-interfete [2021/11/07 14:37]
florin.mihalache [Resurse]
poo-ca-cd:laboratoare:clase-abstracte-interfete [2023/11/05 20:16] (current)
eduard.marin [Exerciţii]
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.+ 
 +**Contest LambdaChecker**:​ [[https://​beta.lambdachecker.io/​contest/​56/​problems?​page=1|Laborator5]] 
 + 
 +1. (**2 puncte**) Implementaţi interfaţa ''​Task''​ î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 ​de tip ''​int'' ​și afișează un mesaj cu numărul generat la output. Generarea se va realiza ​în constructor ​utilizându-se o instanța globală a unui obiect de tip ''​Random''​ care a fost inițializat cu seed-ul **12345** [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Random.html#​Random-long-|Random]]. (''​RandomOutTask.java''​)
   * Un task care incrementează un contor global și afișează valoarea contorului după fiecare incrementare (''​CounterOutTask.java''​).   * Un task care incrementează un contor global și afișează valoarea contorului după fiecare incrementare (''​CounterOutTask.java''​).
  
Line 241: Line 244:
 {{:​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. Creaţi două tipuri de containere care implementează această clasă: 
-  - (**1.5p**) ​''​Stack''​ - care implementează o strategie de tip [[https://​en.wikipedia.org/​wiki/​Stack_(abstract_data_type)|LIFO]] +  - ''​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]]+  - ''​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! **Bonus**: Incercați să evitaţi codul similar în locuri diferite!
Line 254: Line 257:
 {{:​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 numar 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 a unui container!</note>+Spre exemplu interfata ''​Minus''​ va declara metoda: 
 +<code java> 
 +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 
 +  * o metodata getter ''​getNumber''​ care va returna valoarea câmpului ''​value''​ 
 +  * un constructor care primește ca parametru valoarea inițială pentru campul ''​value''​
  
-<​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 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]].</​note>​+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"​.
  
-{{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex3.png?250|}}+4. (**3 puncte**) Implementaţi clasa ''​Song''​ și clasa abstracta ''​Album''​.
  
-4. (**3p**) Extindeţi clasa ''​AbstractTaskRunner'' ​(din pachetul ​''​fourth''​) în 3 moduri: +Song:  
-  * (**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]]). +  ​stochează atributele ​''​name''​''​String'',​ ''​id'':​ ''​int'',​ ''​composer'':​ ''​String''​ 
-  * (**1p**)  ​''​CounterTaskRunner'' ​ incrementează un contor local care ţine minte câte task-uri s-au executat. +  * implementează un constructor ​care va inițializa atributele specificate anterior 
-  * (**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. +  * implementează metodele de tip getter și setter pentru fiecare atribut 
-{{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex4.png?​650|}+  ​suprascrie metoda ''​toString()'' ​care va returna un ''​String''​ forma "Song{name=''​name'',​ id=''​id'',​ composer=''​composer''​}"
-*/+
  
-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ți 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.+Album: 
 +  * stochează o listă de cântece ​(puteți folosi ArrayList)  
 +  ​declară metoda abstractă ''​void addSong(Song song)''​ 
 +  * implementează metodele ​''​void removeSong(Song song)''​ 
 +  * suprascrie metoda ​''​toString()'' ​care va returna un ''​String'' ​forma "​Album{songs=[''​Song''​''​Song''​''​...''​]}
  
-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.+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
  
 +În cazul în care criteriul de adaugare specific unui album nu este respectat melodia nu va fi adaugată în acesta. ​
  
poo-ca-cd/laboratoare/clase-abstracte-interfete.1636288637.txt.gz · Last modified: 2021/11/07 14:37 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