Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Documenti analoghi
Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Oggetti Composti (1) Oggetti Composti (2)

OGGETTI COMPOSTI OGGETTI COMPOSTI - COSTRUZIONE

Programmazione orientata agli oggetti Classi, package e file system. Package

Programmazione orientata agli oggetti Classi, package e file system. Package

PRIMA ESERCITAZIONE IN JAVA

Programmazione orientata agli oggetti Ereditarietà

Programmazione orientata agli oggetti Ereditarietà

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti Ereditarietà

Java Gli array. Array

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Java Gli array. Array

e il loro uso: esistente e cambiare quel che va cambiato specializzare (per ereditarietà) la classe Counter public class EsempioNuovo {

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

Esempio 2: Subtyping

Programmazione orientata agli oggetti Ereditarietà

e il loro uso: Oggetti composti IL TEMA DELLA RIUSABILITÀ APPROCCI PER IL RIUTILIZZO:

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

IL TEMA DELLA RIUSABILITÀ

Object Oriented Software Design

Java Le stringhe. Stringhe

Java Le stringhe. Stringhe

Ereditarietà. Esercizio Specifica

CLASSI e FILE I PACKAGE

public class Counter2 extends Counter { public void dec() { val--; }

Esempio: Costruttori ed ereditarietà

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

IL CONCETTO DI CLASSE

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Java Classi wrapper e classi di servizio. Classi di servizio

Introduzione all OOP!

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Oggetti. Oggetti e occultamento delle informazioni. Definire oggetti. Oggetti. Definire oggetti la sintassi. Convenzione sugli identificatori

Laboratorio di Programmazione 1 [Java]

Corso sul linguaggio Java

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Esercizi della lezione 5 di Java

Dichiarazione di una classe. Dichiarazione ereditarietà

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

RETI DI CALCOLATORI Linguaggio Java: Ereditarietà

Programmazione orientata agli oggetti Il modello di Java. OOP in Java

Polimorfismo. Subtyping-polimorfismo

Programmazione orientata agli oggetti Il modello di Java. OOP in Java

Programmazione ad oggetti

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

Java: Compilatore e Interprete

Oggetti e classi. Cos è un oggetto

Tipi riferimento e stringhe

Java Classi wrapper e classi di servizio. Classi di servizio

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

14 - Metodi e Costruttori

Java secondo contatto. Nel tunnel una luce

Programmazione orientata agli oggetti Subtyping e polimorfismo

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

Motivazioni OBIETTIVO

Fondamenti di Informatica

Programmazione con Java

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

La Gestione della Memoria. Carla Binucci e Walter Didimo

Fondamenti di informatica T-1 (A K) Esercitazione 7: metodi, classi, oggetti

Ereditarietà e Polimorfismo

RIUSABILITÀ L OBIETTIVO

Programmazione orientata agli oggetti Classi astratte e interfacce

Laboratorio di Programmazione 1 [Java]

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

PROGRAMMAZIONE A OGGETTI (OOP) Lezione 4 prj Mesa (Prof. Ing N. Muto)

Classi ed Oggetti. Fondamenti di Informatica A-K

Fondamenti di Informatica

I Metodi. Fondamenti di Informatica A-K

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Multithreading in Java I parte. Lorenzo Gallucci

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

public protected private private package

Gestione della memoria in Java. Emilio Di Giacomo e Walter Didimo

Gerarchia di classi Java 1

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

AMBIENTI DI PROGRAMMAZIONE

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Programmazione. Cognome... Nome... Matricola... Prova scritta del 20 febbraio 2012

Informatica Ereditarietà Java. Ereditarietà

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

Esempio: Interfacce. Gioco Interfacce

E7 Esercizi sul Capitolo 7 Realizzazione di Classi

Transcript:

Programmazione orientata agli oggetti Oggetti Composti 1

- 1 Negli esempi che abbiamo visto finora gli attributi delle classi erano variabili di tipo primitivo E però possibile definire come attributi dei riferimenti ad oggetti di qualche classe In questo modo abbiamo oggetti composti da altri oggetti Consideriamo ad esempio una classe Orologio: public class Orologio { private Counter ore, minuti; Ogni oggetto di classe Orologio ha uno stato composto da due oggetti di classe Counter: c è quindi una relazione di composizione fra la classe Orologio e la classe Counter 2

- 2 Il diagramma UML che rappresenta questa relazione di composizione è: Orologio 1 Counter Orologio può usare gli oggetti di classe Counter contenuti al suo interno: può quindi accedere ai metodi pubblici non può accedere agli attributi e ai metodi privati 3

Costruzione degli oggetti - 1 Gli attributi ore e minuti, come tutte le variabili che hanno come tipo una classe sono solo dei riferimenti La loro dichiarazione non implica creazione di oggetti Devono essere creati esplicitamente con new La cosa migliore è definire un costruttore per la classe Orologio e creare i due oggetti al suo interno: public class Orologio { private Counter ore, minuti; public Orologio() { ore = new Counter(); minuti = new Counter(); 4

Costruzione degli oggetti - 2 In questo modo quando creiamo un oggetto di classe Orologio abbiamo la creazione automatica degli oggetti contenuti Infatti se scriviamo: Orologio o; o = new Orologio(); Generiamo una sequenza di allocazioni di questo tipo: o o Istanza di Orologio -ore -minuti o Istanza di Orologio -ore -minuti Istanza di Counter Istanza di Counter 5

Distruzione In fase di distruzione le cose sono altrettanto automatiche Quando l oggetto di classe Orologio non è più usato da nessuno viene deallocato dal Garbage Collector La deallocazione dell istanza di Orologio fa sparire i due attributi ore e minuti Questi erano gli unici riferimenti esistenti alle due istanze di classe Counter Quindi le due istanze non sono più utilizzate da nessuno e vengono distrutte dal Garbage Collector 6

Esempio: 1.Specifiche Come sempre partiamo dalla definizione delle classi e dei comportamenti: La classe Orologio implementa un orologio con ore e minuti L Orologio deve esporre i seguenti metodi pubblici: reset() che azzera il conteggio di ore e minuti tic() che fa avanzare l orologio di un minuto. Se il conteggio dei minuti arriva a 60 il contatore dei minuti si azzera e si incrementa quello delle ore. Se il contatore delle ore è arrivato a 24 si azzera il contatore delle ore getminuti() e getore() che restituiscono il valore di ore e minuti La classe EsempioOrologio ha un metodo main che crea un orologio e invoca i suoi metodi 7

Esempio: 2.Scelte implementative Vediamo se nelle classi viste in precedenza abbiamo qualcosa di riutilizzabile La classe Counter è quello che ci serve per realizzare i contatori delle ore e dei minuti Quindi la classe Orologio definirà al suo interno due sue variabili di tipo Counter per implementare il comportamento richiesto Quando creiamo un istanza della classe Orologio dovremo creare le due istanze di Counter I metodi di Orologio invocheranno i metodi di Counter delle due istanze Abbiamo quindi un meccanismo di composizione di oggetti 8

Esempio: 3.Modello UML Rappresentiamo la situazione appena descritta: EsempioOrologio +main() : void Orologio -ore : Counter -minuti : Counter +tic() : void +reset() : void +getore() : int +getminuti() : int 1 2 Counter -val : int +inc() : void +reset() : void +getvalue() : int 9

Esempio: 4.Implementazione di Orologio public class Orologio { private Counter ore, min; public Orologio() {ore = new Counter(); min = new Counter() public void reset() { ore.reset(); min.reset(); public void tic() { min.inc(); if (min.getvalue() == 60) { min.reset(); ore.inc(); if (ore.getvalue() == 24) ore.reset(); public int getore(){return ore.getvalue(); public int getminuti(){return min.getvalue(); 10

Esempio: 5.Implementazione di EsempioOrologio public class EsempioOrologio { public static void main(string args[]) { Orologio o; o = new Orologio(); o.tic(); o.tic(); System.out.println(o.getOre()); System.out.println(o.getMinuti()); o.reset(); System.out.println(o.toString()); // DEFINIRE tostring()!!!! 11

Esempio: 4.Implementazione di Orologio public class Orologio { private Counter ore, min; public Orologio() {ore = new Counter(); min = new Counter() public void reset() { ore.reset(); min.reset(); public void tic() { min.inc(); if (min.getvalue() == 60) { min.reset(); ore.inc(); if (ore.getvalue() == 24) ore.reset(); public int getore(){return ore.getvalue(); public int getminuti(){return min.getvalue(); public String tostring() {return "Ore"+ore.getValue()+" Min"+min.getValue(); 12

Esempio: 4.Implementazione di Orologio public String tostring() {return ore.tostring()+min.tostring(); 13

Esempio: 6.Considerazioni E importante notare che nel costruire questa applicazione abbiamo applicato in modo esteso il principio di separazione fra interfaccia e implementazione La classe Orologio usa due istanze della classe Counter basandosi solo sui metodi pubblici (interfaccia) Non viene fatta la minima ipotesi su come Counter sia fatta al suo interno (implementazione) Lo stesso accade per EsempioOrologio : usa i metodi pubblici di Orologio e non si preoccupa minimamente di come questo sia fatto In questo esempio c è l essenza del modo di procedere con il modello ad oggetti: abbiamo costruito per strati la nostra applicazione 14

OOP principi Astrazione (separazione interfaccia e implementazione) Riuso 15

Riutilizzo di componenti e loro raffinamento Spesso si incontrano problemi che richiedono componenti simili ad altri già disponibili, ma non identici Altre volte, l evoluzione dei requisiti comporta una corrispondente modifica dei componenti: necessità di nuovi dati e/o nuovi comportamenti necessità di modificare il comportamento di metodi già presenti Come fare per non dover rifare tutto da capo? 16

Riutilizzo: approcci ricopiare manualmente il codice della classe esistente e cambiare quel che va cambiato 17

Riutilizzo: approcci ricopiare manualmente il codice della classe esistente e cambiare quel che va cambiato creare un oggetto composto (e usare delega) che incapsuli il componente esistente... gli inoltri le operazioni già previste e crei, sopra di esso, le nuove operazioni richieste (eventualmente definendo nuovi dati) sempre che ciò sia possibile! 18

Riutilizzo: approcci ricopiare manualmente il codice della classe esistente e cambiare quel che va cambiato creare un oggetto composto (e usare delega) che incapsuli il componente esistente... gli inoltri le operazioni già previste e crei, sopra di esso, le nuove operazioni richieste (eventualmente definendo nuovi dati) sempre che ciò sia possibile! specializzare (per ereditarietà) il tipo di componente 19

Esempio (esercizio tutorato) Dal contatore Counter (solo avanti) public class Counter { private int val; public Counter() { val = 1; public Counter(int v) { val = v; public void reset() { val = 0; public void inc() { val++; public int getvalue() { return val; 20

Esempio (esercizio tutorato) Dal contatore Counter (solo avanti) public class BiCounter { private int val; public BiCounter() { val = 1; public BiCounter(int v) { val = v; public void reset() { val = 0; public void inc() { val++; public void dec() { val--; public int getvalue() { return val; 21

al contatore avanti/indietro (CounterDec) creare un oggetto composto di tipo CounterDec che incapsuli il componente esistente (di tipo Counter)... gli inoltri le operazioni già previste e crei, sopra di esso, le nuove operazioni richieste (eventualmente definendo nuovi dati) oggetto CounterDec oggetto Counter operazioni di CounterDec Delega 22

al contatore avanti/indietro (CounterDec) al contatore avanti/indietro (con decremento) public class CounterDec { private Counter c; public CounterDec() { c = new Counter(); public CounterDec(int v){ c = new Counter(v); public void reset() { c.reset(); public void inc() { c.inc(); Delega public int getvalue() { return c.getvalue(); public void dec() { int n=c.getvalue(); c.reset(); for (int i=1; i<n; i++) c.inc(); 23

al contatore avanti/indietro (CounterDec) al contatore avanti/indietro (con decremento) public class CounterDec { private Counter c; public CounterDec() { c = new Counter(); public CounterDec(int v){ c = new Counter(v); public void reset() { c.reset(); public void inc() { c.inc(); Delega public int getvalue() { return c.getvalue(); public void dec() { int n=c.getvalue(); c.val = n-1; 24