CLASSI ASTRATTE L’ereditarietà porta riflettere sul

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

© 2007 SEI-Società Editrice Internazionale, Apogeo Unit à B2 Gli oggetti: concetti avanzati.
Unified Modeling Language
Oggetti Java.
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Programmazione Ingegneria TLC
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Si consideri il seguente programma: class Up extends Object { public static int x; public int y; public static void metodo(Up o) {Up w=o.metodo1(x); o.y=w.y+6;}
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
SISSIS MODULO DI JAVA PER LA CLASSE IV DELL’ITI
Fondamenti di Informatica
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) JAVA: i commenti Anno Accademico 2009/2010.
Derivazione tra classi
Overriding.
Soluzione Esercizio - Classe Vettore
Programmazione II: Tecniche Avanzate. (A.A. 1999/2000) - Lezione 6 1 Estensione di classi: il Contratto INTERFACCIA E REALIZZAZIONE Che cosa realizza una.
Selezione (=scelta) con “if-else”
CAPITOLO 1 JAVA: UN TUFFO NEL LINGUAGGIO E NELL'AMBIENTE.
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Java base IV: Java e la programmazione O.O.
IL CONCETTO DI PACKAGE Una applicazione è spesso composta di molte classi (eventualmente correlate) Un package è un gruppo di classi che costi- tuiscono.
CLASSI ED EREDITARIETÀ Come si è visto, è cruciale che la gerarchia rispecchi la realtà del mondo ma a volte ciò contraddice principi di efficienza Esempio:
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
Programmazione in Java (8)
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
E vertebrati invertebrati.
I Metodi in Java Il termine "metodo" è sinonimo di "azione". Quindi, affinché un programma esegua qualche istruzione, deve contenere metodi.
Diagramma di flusso del problema del Supermercato.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Invertebrati.
Programmazione concorrente
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
1 Incapsolamento (intro) Sandro Pedrazzini Approfondimento Incapsolamento (introduzione)
Problema dei Contratti Telefonici
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Diagramma di flusso del problema dello stipendio del rappresentante.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Polimorfismo.
Lezione n° 07 - Esercitazione
Esercizi.
Esercitazione Ereditarietà Polimorfismo. Entita’ Geometrica PuntoCerchioPoligono TriangoloQuadrilatero Rettangolo Quadrato.
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Programmazione ad oggetti
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Fondamenti di Informatica II Ingegneria Informatica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Gestione dei thread in Java
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Ese 1 (del 31 Marzo 2004). Il compilatore Non esegue il programma, non guarda i valori che possono assumere di volta in volta le variabili, non fa assunzioni.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
La programmazione ad oggetti
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

CLASSI ASTRATTE L’ereditarietà porta riflettere sul rapporto fra progetto e struttura: una classe può limitarsi a definire solo l’interfaccia… ..lasciando “in bianco” uno o più metodi... ...che verranno poi implementati dalle classi derivate: è una classe astratta

CLASSI ASTRATTE Una classe astratta: fattorizza, dichiarandole, operazioni comuni a tutte le sue sottoclassi… ... ma non le definisce (implementa) In effetti, non viene creata per definire istanze (che non saprebbero come rispondere ai metodi “lasciati in bianco”) ma per derivarne altre classi, che dettaglieranno i metodi qui solo dichiarati.

CLASSI ASTRATTE: ESEMPIO public abstract class Animale { public abstract String verso(); public abstract String si_muove(); public abstract String vive(); ... } I metodi astratti non hanno corpo Se anche solo un metodo è abstract, la classe deve essere qualificata abstract, altrimenti si ha ERRORE.

CLASSI ASTRATTE: PERCHÉ? Moltissime entità che usiamo per descri-vere il mondo non sono reali sono pure categorie concettuali, ma sono comunque molto utili! Esempio: gli animali parlare di “animali” ci è molto utile, però non esiste “il generico animale” !! nella realtà esistono solo animali specifici ma la categoria concettuale “animale” ci fa molto comodo per “parlare del mondo”

ESEMPIO: GLI ANIMALI Tutti sappiamo cosa sia un animale: ogni animale ha un qualche verso ogni animale si muove in qualche modo ogni animale vive in un qualche ambiente ...ma proprio per questo, non esiste “il generico animale”! Ogni animale reale: ha uno specifico verso, si muove in uno specifico modo, vive in uno specifico ambiente. (acqua, aria, terraferma, etc.)

ESEMPIO: GLI ANIMALI Introdurre una classe animale è utile proprio per fattorizzare gli aspetti comuni tutti gli animali hanno un verso, si muovono in un qualche modo, ecc. Tali aspetti inducono una classificazione del mondo: animali acquatici, uccelli, mammiferi… Peraltro, non esistono neanche generici uccelli, mammiferi, etc… ma disporre di queste categorie concettuali è assai utile!

CLASSI ASTRATTE: ESEMPIO public abstract class Animale { public abstract String verso(); public abstract String si_muove(); public abstract String vive(); ... } Esprime il fatto che ogni animale ha un verso, si muove, e vive da qualche parte.. ...ma in generale non si può dire come.

CLASSI ASTRATTE: ESEMPIO public abstract class AnimaleTerrestre extends Animale { public String vive() { // era abstract return "sulla terraferma"; } ... } Una classe derivata può definire uno o più metodi che erano astratti se anche solo un metodo rimane astratto, la classe derivata è comunque astratta (e deve essere qualificata come tale)

L’ESEMPIO COMPLETO Ipotesi: ogni animale ha un metodo chi_sei() che restituisce una stringa descrittiva ogni animale ha un metodo mostra() che lo stampa a video e che è indipendente dallo specifico animale (si appoggia sugli altri metodi) tutti gli animali si rappresentano nello stesso modo, tramite il loro nome e il verso che fanno.

costruttore necessario L’ESEMPIO COMPLETO public abstract class Animale { private String nome; protected String verso; public Animale(String s) { nome=s; } public abstract String si_muove(); public abstract String vive(); public abstract String chi_sei(); public void mostra() { System.out.println(nome + ", " + chi_sei() + ", " + verso + ", si muove " + si_muove() + " e vive " + vive() ); } } costruttore necessario

L’ESEMPIO COMPLETO Una possibile classificazione: ANIMALE ANIMALE_TERRESTRE ANIMALE_ACQUATICO Sono ancora classi astratte: nulla si sa del movimento quindi è impossibile definire il metodo si_muove()

L’ESEMPIO COMPLETO public abstract class AnimaleTerrestre extends Animale { public AnimaleTerrestre(String s) { super(s); } public String vive() { return "sulla terraferma"; } public String chi_sei() { return "un animale terrestre"; } } Due metodi astratti su tre sono ridefiniti, ma uno è ancora astratto  la classe è ancora astratta

L’ESEMPIO COMPLETO public abstract class AnimaleAcquatico extends Animale { public AnimaleAcquatico(String s) { super(s); } public String vive() { return "nell'acqua"; } public String chi_sei() { return "un animale acquatico"; } } Due metodi astratti su tre sono ridefiniti, ma uno è ancora astratto  la classe è ancora astratta

L’ESEMPIO COMPLETO Una possibile specializzazione: ANIMALE ANIMALE_TERRESTRE ANIMALE_ACQUATICO ANIMALE_MARINO Perché introdurre l’animale marino? non è correlato a verso, movimento, etc rispecchia semplicemente una realtà.

L’ESEMPIO COMPLETO public abstract class AnimaleMarino extends AnimaleAcquatico { public AnimaleMarino(String s) { super(s); } public String vive() { return "in mare"; } public String chi_sei() { return "un animale marino"; } } Specializza i metodi vive() e chi_sei(), ma non definisce l’altro  la classe è ancora astratta

LA TASONOMIA COMPLETA ANIMALE ANIMALE_TERRESTRE ANIMALE_ACQUATICO ANIMALE_MARINO QUADRUPEDE BIPEDE UCCELLO UOMO CAVALLO CORVO PINGUINO PESCE (di mare) TONNO Tweety bird Crow tun Equus Homo

LE CLASSI “CONCRETE” public class PesceDiMare extends AnimaleMarino { public PesceDiMare(String s) { super(s); verso = "non fa versi"; } public String chi_sei() { return "un pesce (di mare)"; } public String si_muove() { return "nuotando"; } } Definisce l’ultimo metodo astratto rimasto, si_muove()  la classe non è più astratta

LE CLASSI “CONCRETE” public class Uccello extends AnimaleTerrestre { public Uccello(String s) { super(s); verso="cinguetta"; } public String si_muove() { return "volando"; } public String chi_sei() { return "un uccello";} public String vive() { return "in un nido su un albero"; } }

LE CLASSI “CONCRETE” public class Bipede extends AnimaleTerrestre { public Bipede(String s) { super(s); } public String si_muove() { return "avanzando su 2 zampe"; } public String chi_sei() { return "un animale con due zampe"; } }

LE CLASSI “CONCRETE” public class Quadrupede extends AnimaleTerrestre { public Quadrupede(String s) { super(s); } public String si_muove() { return "avanzando su 4 zampe"; } public String chi_sei() { return "un animale con 4 zampe"; } }

ALTRE CLASSI PIÙ SPECIFICHE public class Cavallo extends Quadrupede { public Cavallo(String s) { super(s); verso = "nitrisce"; } public String chi_sei() { return "un cavallo"; } } public class Corvo extends Uccello { public Corvo(String s) { super(s); verso = "gracchia"; } public String chi_sei() { return "un corvo"; }

ALTRE CLASSI PIÙ SPECIFICHE public class Uomo extends Bipede { public Uomo(String s) { super(s); verso = "parla"; } public String si_muove() { return "camminando su 2 gambe"; } public String chi_sei() { return "un homo sapiens"; } public String vive() { return "in condominio"; } }

ALTRE CLASSI PIÙ SPECIFICHE public class Pinguino extends Uccello { public Pinguino(String s) { super(s); verso = "non fa versi"; } public String chi_sei() { return "un pinguino"; } public String si_muove() { return "ma non sa volare"; } } public class Tonno extends PesceDiMare { public Tonno(String s) { super(s); } public String chi_sei() { return "un tonno"; }

UN MAIN… “mondo di animali” public class MondoAnimale { public static void main(String args[]) { Cavallo c = new Cavallo("Furia"); Uomo h = new Uomo("John"); Corvo w = new Corvo("Pippo"); Tonno t = new Tonno("Giorgio"); Uccello u = new Uccello("Gabbiano"); Pinguino p = new Pinguino("Tweety"); c.mostra(); h.mostra(); w.mostra(); t.mostra(); u.mostra(); p.mostra(); }

UN MAIN… “mondo di animali” .. e il suo output: Furia, un cavallo, nitrisce, si muove avanzando su 4 zampe e vive sulla terraferma. John, un homo sapiens, parla, si muove camminando su 2 gambe e vive in un condominio. Pippo, un corvo, gracchia, si muove volando e vive in un nido su un albero. ...

ALTERNATIVA: UNO “ZOO” public class Zoo { public static void main(String args[]) { Animale fauna[] = new Animale[6]; fauna[0] = new Cavallo("Furia"); fauna[1] = new Uomo("John"); fauna[2] = new Corvo("Pippo"); fauna[3] = new Tonno("Giorgio"); fauna[4] = new Uccello("Gabbiano"); fauna[5] = new Pinguino("Tweety"); for(int i=0; i<6; i++) fauna[i].mostra(); } POLIMORFISMO: per ogni animale viene invocato lo specifico metodo mostra()