Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013
Relazioni tra classi Ereditarietà Generalizzazione Specializzazione Aggregazione Composizione Dipendenza Associazione Sommario
Relazioni tra classi Ereditarietà Generalizzazione Specializzazione Aggregazione Composizione Associazione Dipendenza Sommario
Relazioni tra classi:ereditarietà Generalizzazione & Specializzazione L ereditarietà è il meccanismo attraverso il quale una classe detta Figlio eredita le caratteristiche di una classe detta Padre Il significato della generalizzazione è che ogni istanza della sottoclasse è anche istanza della superclasse pertanto la classe figlio può essere interpretata anche come un tipo di padre. A è una generalizzazione di B B è una specializzazione di A. B aggiunge caratteristiche strutturali e comportamentali ad A B ha i propri attributi e metodi + attributi e operazioni ereditati da A (con visibilità public,protected) B può ridefinire attributi e operazioni ereditati da A 16/01/2013 4
Relazioni tra classi:ereditarietà Generalizzazione & Specializzazione L ereditarietà è il meccanismo attraverso il quale una classe detta Figlio eredita le caratteristiche di una classe detta Padre Il significato della generalizzazione è che ogni istanza della sottoclasse è anche istanza della superclasse pertanto la classe figlio può essere interpretata anche come un tipo di padre. La relazione nel verso della generalizzazione può essere letta come Uno Studente è un tipo di Persona La relazione nel verso della specializzazione può essere letta come Una Persona può essere uno Studente 16/01/2013 5
Relazioni tra classi:ereditarietà Generalizzazione & Specializzazione L ereditarietà è il meccanismo attraverso il quale una classe detta Figlio eredita le caratteristiche di una classe detta Padre Il significato della generalizzazione è che ogni istanza della sottoclasse è anche istanza della superclasse pertanto la classe figlio può essere interpretata anche come un tipo di padre. Si dice che tra una sottoclasse e la sua superclasse esiste una relazione di tipo is-a Studente e un tipo di (is-a, is-a-kind-of) Persona 16/01/2013 6
Relazioni tra classi:ereditarietà Generalizzazione & Specializzazione Esempio UML:Class Diagram Mostra un insieme di classi (concrete, astratte, interfacce ) e le relazioni tra esse (dipendenza, associazione, aggregazione, composizione, generalizzazione) Può essere visto come un grafo dove i classi/interfacce e gli archi le relazioni nodi sono 16/01/2013 7
Esempio UML:Object Diagram I diagrammi degli oggetti sono una variante dei class diagram (hanno la stessa notazione ). Forniscono possibili fotografie del sistema in esecuzione. Mettono in relazione ISTANZE (oggetti) di classi specificando il loro nome e tipo(classe). 16/01/2013 8
Relazioni tra classi:ereditarietà Generalizzazione & Specializzazione 16/01/2013 9
Relazioni tra classi:ereditarietà Generalizzazione & Classi Astratte Una Classe Astratta contiene metodi privi di implementazione Per questa ragione non può essere istanziata Il corsivo permette di distinguere le parti astratte da quelle concrete 10
Relazioni tra classi:ereditarietà Generalizzazione & Classi Astratte Una Classe Astratta contiene metodi privi di implementazione Per questa ragione non può essere istanziata Il corsivo permette di distinguere le parti astratte da quelle concreteclasseastratta 11
Relazioni tra classi:ereditarietà Generalizzazione & Classi Astratte La classe astratta Veicolo definisce le caratteristiche comuni di tutti i veicoli ma la classe non è istanziabile in quanto non esiste un veicolo. Lo stesso vale per le altre classi astratte Veicolo Terrestre e Veicolo Aereo Le classi Automobile, Moto, Aereo ed Elicottero sono invece classi istanziabili perche si riferiscono ad entità esistenti nel mondo reale di cui è possibile definire una implementazione per tutte le operazioni. 12
Relazioni tra classi:ereditarietà multipla L'ereditarietà singola modella bene le relazioni insieme/sottoinsieme ma non le intersezioni di insiemi, che necessitano della ereditarietà multipla 13
Relazioni tra classi:ereditarietà multipla Diventa una tassonomia di INTERFACCE!! L'ereditarietà singola modella bene le relazioni insieme/sottoinsieme m non le intersezioni di insiemi, che necessitano della ereditarietà multipla 14
Relazioni tra classi:ereditarietà multipla Interfacce Una interfaccia è una specifica di comportamento Una interfaccia è definita da un insieme di operazioni astratte. Una classe che implementa una interfaccia fornisce una possibile realizzazione della specifica La relazione che lega una interfaccia alla classe che la implementa si chiama realizzazione La classe Elicottero implementa l interfaccia IVolante in quanto implementa tutte le sue operazioni (in questo caso vaia ) 15
Relazioni tra classi:ereditarietà multipla Interfacce Le interfacce rappresentano collezioni di operazioni che sono utilizzate per specificare un servizio di una classe e definiscono solo la segnatura delle operazioni 16
La freccia tratteggiata indica esattamente la realizzazione,ossia l implementazione di un interfaccia Da non confondere con la freccia continua dell ereditarietà Esempio di interface Le interfacce sono SEMPRE PUBBLICHE e dichiarano sempre e solo metodi PUBBLICI e costanti PUBBLICHE 16/01/2013 17
Relazioni tra classi:ereditarietà multipla Interfacce Una interfaccia può ereditare operazioni da un altra interfaccia 18
Relazioni tra classi:ereditarietà multipla Interfacce Una interfaccia può ereditare operazioni da un altra interfaccia Dopo extends può esservi un elenco di più interfacce 19
Relazioni tra classi:aggregazione L aggregazione è un vincolo debole (più debole della composizione) identifica classi con periodo di vita diverso ciò implica che quando l'oggetto ottenuto aggregando altri oggetti viene distrutto gli oggetti che lo caratterizzano rimangono comunque in vita. Nota:l aggregazione è indicata da un rombo vuoto rivolto verso la classe contenitore.
Relazioni tra classi:aggregazione L aggregazione è un vincolo debole (più debole della composizione) identifica classi con periodo di vita diverso ciò implica che quando l'oggetto ottenuto aggregando altri oggetti viene distrutto gli oggetti che lo caratterizzano rimangono comunque in vita. Nota:l aggregazione è indicata da un rombo vuoto rivolto verso la classe contenitore.
L'aggregazione (vincolo debole) indica che gli oggetti "contenuti" ha vita propria anche senza l'oggetto contenitore ovvero esistono anche se sparisce la relazione... Esempio: La classe A è formata da istanze delle classi B, C, D (precedentemente definite) messe in relazione per aggregazione. Il programmatore per utilizzare la classe A rispettando la relazione di aggregazione nel main crea prima le istanze dei tre oggetti (B;C;D) e poi li associa ai componenti dell'oggetto: public class A { private B oggettob; private C oggettoc; private D oggettod; public void setb(b ob); public void setc(c oc); public void setd(d od); } tipo identificatore 16/01/2013 22
L'aggregazione (vincolo debole) indica che l'oggetto "contenuto" ha vita propria anche senza l'oggetto contenitore. public static void main(string[] args) { B b = new B(); C c = new C(); D d = new D(); } } A a = new A(); a.setb(b); a.setc(c); a.setd(d); 16/01/2013 23
Esercizio sull Aggregazione 16/01/2013 24
Esercizio sull Aggregazione 16/01/2013 25
Esercizio sull Aggregazione 16/01/2013 26
Relazioni tra classi:composizione L aggregazione è un vincolo debole (più debole della composizione) identifica classi con periodo di vita diverso ciò implica che quando l'oggetto ottenuto aggregando altri oggetti viene distrutto gli oggetti che lo caratterizzano rimangono comunque in vita. Nota:l aggregazione è indicata da un rombo vuoto rivolto verso la classe contenitore.
La composizione identifica classi con stesso periodo di vita ciò implica che quando viene distrutto l'oggetto composito tutti gli oggetti che lo caratterizzano devono essere distrutti. Nota:la composizione è indicata da un rombo pieno rivolto verso la classe contenitore. 16/01/2013 28
La composizione identifica classi con stesso periodo di vita ciò implica che quando viene distrutto l'oggetto composito tutti gli oggetti che lo caratterizzano devono essere distrutti. Nota:la composizione è indicata da un rombo pieno rivolto verso la classe contenitore. L'aggregazione (vincolo forte) indica che l'oggetto contenuto non ha vita propria, quindi deve essere distrutto assieme al contenitore 16/01/2013 29
Esempio: La classe A è formata da istanze delle classi B, C, D (precedentemente definite) messe in relazione per composizione ( quindi per rispettare questa relazione il programmatore non può mai creare istanze di B, C e D al di fuori di un'istanza di A). Il programmatore per utilizzare la classe A rispettando la relazione di aggregazione deve creare prima nella classe A le istanze dei tre oggetti (B;C;D) che compongono i campi dell'oggetto A. public class A { } La composizione identifica classi con stesso periodo di vita ciò implica che quando viene distrutto l'oggetto composito tutti gli oggetti che lo caratterizzano devono essere distrutti. La composizione è una relazione più forte quindi gli oggetto contenuti non possono esistere senza il contenitore... public void usob() tipo { B b = new B(); b.metododib(); } identificatore public void usoc() { C c = new C(); c.metododic(); } public void usod() { D d = new D(); d.metododid(); 16/01/2013 } 30
La composizione identifica classi con stesso periodo di vita ciò implica che quando viene distrutto l'oggetto composito tutti gli oggetti che lo caratterizzano devono essere distrutti. La composizione è una relazione più forte quindi gli oggetto contenuti non possono esistere senza il contenitore... Nel main si crea l oggetto A e automaticamente si usano i suoi componenti. public static void main(string[] args) { A a = new A(); a.usob(); a.usoc(); a.usod(); } 16/01/2013 31
UML:Class Diagram Mostra un insieme di classi (concrete, astratte, interfacce ) e le relazioni tra di esse (dipendenza, associazione, aggregazione, composizione, generalizzazione) Può essere visto come un grafo dove i classi/interfacce e gli archi le relazioni nodi sono 16/01/2013 32
UML:Object Diagram I diagrammi degli oggetti sono una variante dei class diagram (hanno la stessa notazione ) cheforniscono possibili fotografie del sistema in esecuzione. Infatti mettono in relazione ISTANZE (oggetti) di classi identificati con il loro nome e non tipi di dato (classi). 16/01/2013 33
Relazioni tra classi:associazione L'associazione è una relazione simile all aggregazione che esprime una relazione fra una o più classi. E' caratterizzata da: un nome una molteplicità Può essere: simmetrica (navigabile nelle due direzioni) ricorsiva (ovvero tra oggetti della stessa classe) Si rappresenta con una linea continua di unione senza freccia (per indicare che il senso di lettura è bidirezionale) o con freccia. Ci sono fondamentalmente 3 tipi di associazioni: uno-a-uno uno-a-molti molti-a-molti Nel primo caso l'oggetto della classe A contiene il riferimento all'oggetto della classe B (Esattamente come nell'esempio dell'aggregazione). Nel secondo caso l'oggetto della classe A contiene il riferimento a un array di oggetti appartenenti alla classe B. 16/01/2013 34 L'ultimo caso, cambia dal secondo solo perché pure la classe B avrà un array che fa riferimento alla classe A.
L'associazione uno a uno Un Automobile ha al più un Proprietario Nel Proprietario Non c è il riferimento all automobile 16/01/2013 35
L'associazione uno a uno 16/01/2013 36
L'associazione uno a uno 16/01/2013 37
L'associazione uno a uno bidirezionale 16/01/2013 38
L'associazione uno a uno bidirezionale class CartaIdentita { private Persona possessore; private String numero; public void associapersona(persona partner); CartaIdentita (String numcarta); }; class Persona { private CartaIdentita documento; private String nome; public void associacartaidentita(cartaidentita partner); Persona (String nompersona); } Nella classe Persona c è il riferimento alla classe CartaIdentità 16/01/2013 39
L'associazione uno a uno bidirezionale { //istanziazione delle variabili CartaIdentita cartiden = new CartaIdentita( AC1234 ); Persona pers = new Persona( Tizio ); //creazione dell associazione tra i due oggetti cartiden.associapersona(pers); pers.associaazienda(cartiden); // segue }; 16/01/2013 40
L'associazione riflessiva 16/01/2013 41
Esercizio di associazione 16/01/2013 42
Esempio di associazione uno-a-molti. In una casa vivono una o più persone. Un oggetto della classe Casa contiene il riferimento a un array di classe Persona. La classe Persona, invece, contiene solamente un riferimento alla classe Casa. 16/01/2013 43
Associazione uno-a-molti Corso di Laurea Studente class CorsodiLaurea { private Studente [] studenti; private String denominazione; public void aggstudente (Studente newstud); CorsodiLaurea (String denomcorso); }; class Studente { private CorsodiLaurea iscrizione; private String matricola; private String nome; public void associacdl(corsodilaurea partner); Studente(String nome, String numeromat); }; 16/01/2013 44
Associazione uno-a-molti Impiegato Società 16/01/2013 45
Relazioni tra classi:dipendenze Una dipendenza è una relazione tra due elementi, dove un cambiamento ad uno di essi (il fornitore) può influenzare o fornire delle informazioni necessarie all altro (il cliente) La dipendenza va in un sola direzione: dal cliente al fornitore A differenza delle associazioni, una relazione di dipendenza non sussiste fra istanze nel dominio rappresentato, ma sussiste fra gli elementi del modello UML stesso o fra le astrazioni che tali elementi rappresentano 16/01/2013 46
Relazioni tra classi:dipendenze L automobile per viaggiare usa le strade (tratto percorribile) Al contrario le strade esistono indipendentemente dalle automobili void public class Automobile {public void percorri( TrattoPercorribile p){...}} 16/01/2013 47
Esercizio 16/01/2013 48
Esercizio 16/01/2013 49