This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:clase-abstracte-interfete [2022/11/06 18:14] bogdan.vatamanu [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 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 abstracte, atunci ea trebuie să conţină în definiţie cuvântul ''abstract''. |
Exemplu: | Exemplu: | ||
Line 232: | Line 232: | ||
==== Exerciţii ==== | ==== Exerciţii ==== | ||
+ | <note important> | ||
+ | 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. | ||
- | **Schelet de laborator**: [[https://github.com/oop-pub/oop-labs/tree/master/src/lab5|Laborator5]] | + | </note> |
- | 1. (**2 puncte**) Implementaţi interfaţa ''Task'' (din pachetul ''lab5.task1'') în cele 3 moduri de mai jos. | + | 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 (''OutTask.java'') care să afișeze un mesaj la output. Mesajul este specificat în contructorul clasei. |
- | * Un task care generează un număr aleator ș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 (''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 care incrementează un contor global și afișează valoarea contorului după fiecare incrementare (''CounterOutTask.java''). | + | * 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 244: | Line 246: | ||
{{:poo-ca-cd:laboratoare:clase-abstracte-interfete:ex1.png?600|}} | {{:poo-ca-cd:laboratoare:clase-abstracte-interfete:ex1.png?600|}} | ||
- | 2. (**3 puncte**) Interfaţa ''Container'' (din pachetul ''lab5.task2'') 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**) În pachetul ''lab5.task3'' 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. | + | 3. (**2 puncte**) Creați 4 interfețe: ''Minus'', ''Plus'', ''Mult'', ''Div'' care conțin câte o metodă aferentă numelui ce are ca argument un număr de tipul float. |
- | Spre exemplu interfata ''Minus'' va declara metoda: | + | Spre exemplu interfața ''Minus'' va declara metoda: |
<code java> | <code java> | ||
void minus(float value); | void minus(float value); | ||
</code> | </code> | ||
Scrieți clasa ''Operation'' care să implementeze toate aceste interfețe. Pe lânga metodele interfețelor implementate aceasta va conține: | 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 ''value'' de tipul ''float'' asupra căruia se vor efectua operațiile implementate | + | * 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'' | * o metodata getter ''getNumber'' care va returna valoarea câmpului ''value'' | ||
* un constructor care primește ca parametru valoarea inițială pentru campul ''value'' | * un constructor care primește ca parametru valoarea inițială pentru campul ''value'' | ||
- | 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 zero is not posible". | + | 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. (**3 puncte**) Implementaţi clasa ''Song'' și clasa abstracta ''Album''. | ||
- | 4. (**3 puncte**) În pachetul ''lab5.task4'' scrieți clasa ''Song'' și clasa abstacta ''Album''. | + | Song: |
- | Song: | + | * stochează atributele ''name'' de tip ''String''. ''id'' de tip ''int'' si ''composer'' de tip ''String'' |
- | * stocheaza atributele ''name'': ''String'', ''id'': ''int'', ''composer'': ''String'' | + | * are un constructor care va inițializa atributele specificate anterior |
- | * implementeaza un constructor care va inițializa atributele specificate anterior | + | * implementează metodele de tip getter și setter pentru fiecare atribut |
- | * implementeaza metodele de tip getter și setter pentru fiecare atribut | + | * suprascrie metoda ''toString()'' care va returna un ''String'' de forma "Song{name=''name'', id=''id'', composer=''composer''}" |
- | * suprascrie metoda ''toString()'' care va returna un șir de format "Song{name=''name'', id=''id'', composer=''composer''}" | + | |
Album: | Album: | ||
- | * stocheaza o listă de cântece (puteți folosi ArrayList) | + | * stochează o listă de cântece |
- | * declara metoda abstractă ''addSong'' | + | * declară metoda abstractă numită addSong care primește un Song și nu returnează nimic |
- | * implementeaza metodele ''removeSong'' | + | * implementează metoda removeSong care primește un song și nu returnează nimic |
- | * suprascrie metoda ''toString()'' care va returna un si de format "Album{songs=[''Song'', ''Song'', ''...'']} | + | * suprascrie metoda ''toString()'' care va returna un ''String'' de forma "Album{songs=[Song, Song, ...]}" |
- | Dupa implementarea claselor ''Song'' si ''Albun'' creați clasele ''DangerousAlbum'', ''ThrillerAlbum'' si ''BadAlbum'' care vor mosteni clasa ''Album'' si vor implementa metoda ''addSong'' dupa urmatoarele reguli: | + | 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 | * ''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 | + | * ''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 | * ''BadAlbum'' conține doar melodii care au nume de 3 litere și id număr palindrom | ||
- | In cazul in care criteriu de adaugare specific unui album nu este respectat melodia nu va fi adaugata in acesta. | + | În cazul în care criteriul de adăugare specific unui album nu este respectat, melodia nu va fi adaugată în acesta. |