










Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Proprieta java programmazione orientata agli oggetti polimorfismo di interfaccie
Tipologia: Appunti
1 / 18
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!











1
class Animale { public void verso () { System.out.println("Io sono un Animale"); } } class Pesce extends Animale { public void verso() { System.out.println(”glug glug");} } class Uccello extends Animale { public void verso() { System.out.println(”tweet tweet"); } } class Cane extends Animale { public void verso() { System.out.println(“woof woof"); } public void ringhiare() { System.out.println("Arf Arf"); } } tanto per dire che “un animale avrà un verso” non certo per scrivere un codice che valga nelle varie classi derivate --- MA NON POTREI EVITARE DI SCRIVERE QUESTO CODICE ?? ha poco senso senza sapere di che animale sto parlando!! nel contratto!
3
considerazioni su ADT ● una classe fornisce la definizione di un tipo astratto (ADT):
specializzata per diverse applicazioni, ● potrebbe prevedere solo la forma astratta ma non l’implementa
● Sarebbe utile definire classi per cui si prevedono tipologie di comportamento che solo le sottoclassi sono chiamate ad implementare in base alla loro forma
utile evitarlo requisiti in sintesi
1. definire un tipo nella sua forma astratta senza dover necessariamente definire l’implementazione concreta
7 interfaccia ● Un interfaccia è una collezione di header di metodi senza la loro definizione
● Uso della stessa rappresentazione (forma/struttura della interfaccia - what) per effettuare operazioni (comportamenti) “simili”:
9 eredità vs polimorfismo ● L’Ereditarietà impone una Interfaccia - WHAT- e anche un Comportamento - HOW. ● Il Polimorfismo impone solamente una Interfaccia - WHAT
eredità vs polimorfismo
● Con il Polimorfismo dico il COSA, lasciando ai casi specifici l’opportunità di dire il COME , mentre ● con l’Ereditarietà dico sia il COSA che il COME una volta soltanto per tutti i moduli sia Padre che Figlio. ● L’Ereditarietà impone una Interfaccia - il COSA - e anche un Comportamento - il COME. ● Il Polimorfismo impone solamente una Interfaccia - il COSA. nell’inheritance di classi: polimorfismo : capacità di un oggetto di assumere forme molteplici
13 implementazione ● polimorfismo ß quando più classi realizzano la stessa interfaccia, ciascuna realizza i metodi in modo diverso ● in che modo viene eseguito il metodo corretto? ● il meccanismo delle Interfacce è molto simile al meccanismo “è un”/IsA associato alle SuperClassi nell’Ereditarietà ● per evidenziare la differenza, java chiama interface l’interfaccia e usa la parola chiave implements al posto di usare la parola chiave extends nella classe derivata. public class Cerchio implements Forma{ … }
implementazione di interfacce ● Una classe può implementare i metodi di un'interfaccia in qualunque modo il progettista della classe scelga. ● Un'interfaccia quindi può avere molte implementazioni possibili di una classe. ● Ogni ‘classe importante’ in un'applicazione dovrebbe essere l'implementazione di un interfaccia che “catturi” il contratto di quella classe. ● Le classi possono implementare più di un'interfaccia.
15 una interfaccia e più implementazioni interface Animale { void verso ();} class Pesce implements Animale { public void verso() { System.out.println("Glug glug");} } class Uccello implements Animale { public void verso() { System.out.println("Tweet tweet"); } } class Cane implements Animale { public void verso() { System.out.println("woof woof");} public void ringhiare() { System.out.println("Arf Arf"); } } classe test public class Zoo { public static void main (String[] argv) { Animale[] zoo = new Animale[ 3 ]; zoo[0] = new Uccello( ); zoo[1] = new Cane( ); zoo[2] = new Pesce( ); for (Animale animale : zoo) { animale.verso(); if (animale instanceof Cane){ Cane c = (Cane) animale; c.ringhia(); } } } }
19 note di linguaggio: dichiarazione di interfaccia ● una interfaccia è dichiarata usando la parola chiave interface, dandole un nome ed una lista di membri di interfaccia tra {}. modificatore interface nomeInterfaccia { listaMembri } ● una interfaccia può dichiarare I tipi di membri:
21 eredità multipla tra interfacce ● Java supporta eredità multipla fra interfacce una interfaccia contiene solo dichiarazioni di metodi ● Tradizionalmente Java (prima di Java 8 ) non aveva implementazioni di metodi à nessun problema di collisione fra metodi omonimi ● non ha variabili nessun problema di collisione fra dati omonimi ● È un potente strumento di modellazione ● public interface Worker { ... } public interface Student { ... } public interface WorkerStudent extends Worker, Student { ... } ● Dopo extends può esservi un elenco di più interfacce gerarchie di interfacce ● La gerarchia delle interfacce:
25 Metodi static ● Non c’è motivo tecnico per imporre che una interfaccia non abbia metodi static
Metodi di default ● Qualsiasi metodo di interfaccia può avere una implementazione di default ● Questi metodi devono essere contrassegnati con il modificatore default Risoluzione dei conflitti della multiple inheritance ● Se una classe implementa 2 interfacce, InterfaceA e InterfaceB, che implementano entrambe un metodo, methodName(…) di default con la signature(nome e parametri)
27 classi astratte e concrete ● le classi astratte definiscono solo una parte di un'implementazione , lasciando alle classi derivate il compito di fornire specifiche implementazioni di alcuni o di tutti i metodi. ● per contro, la classe concreta ha solo metodi concreti, comprese le implementazioni di tutti i metodi astratti ereditati dalle superclassi ● le classi astratte definiscono parte del comportamento di oggetti di un certo tipo ● le classi astratte ed i metodi che esse non implementano sono dichiarati abstract
31 esempio di figure geometriche, un test public class FigureTest { public static void main(String[] args) { Figura r = new Rettangolo( 10 , 12 ); Figura q = new Rettangolo( 10 , 10 ); Figura c = new Cerchio( 4 ); System.out.println(c); System.out.println(r); System.out.println(q); Figura f = q; System.out.println("ho assegnato a una figura un rettangolo"); boolean b = f instanceof Cerchio; System.out.println("Figura è una Cerchio" + b); b = f instanceof Rettangolo; System.out.println("Figura è una Rettangolo" + b); System.out.println(" Rettangolo è una figura" + (r instanceof Figura) ); } } sulle Classi Astatte ● le Classi Astratte si usano su oggetti dove si può beneficiare dell’Ereditarietà ...Ovvero se ci sono aspetti comuni
… anche se possono e devono definire costruttori …da usare per inizializzare i propri campi nell’istanza di classi concrete
● meglio NON usare l’astrazione quando si possono estendere classi concrete. ● meglio non usare ereditarietà su oggetti concreti + overriding se questo implica una violazione del Principio di Sostituzione di Liskov.
33 un esempio di classe astratta public abstract class Animale { private String nome; Animale(String nome) { this.nome=nome; } //costruttore public abstract String attivita(); public abstract String vive(); public abstract String mangia(); public void presentati(){ System.out.println("Mi chiamo "+nome+ " mi piace "+attivita()+", "+ "vivo "+vive()+ " e mangio "+mangia()); } } l’unico metodo concreto l’unico metodo che accede al campo nome: Nelle sottoclassi l’avvesso è negato: nome e private e Non ho qui un getter delle classi concrete public class Scoiattolo extends Animale { public Scoiattolo(String s){super(s);} public String attivita(){ return "saltare tra i rami";} public String vive(){ return "nei boschi";} public String mangia(){ return "ghiande";} } public class Leone extends Animale { public Leone(String s) {super(s);} public String attivita(){return "cacciare";} public String vive(){return "in Africa";} public String mangia(){return "carne";} }