18 - Classi parzialmente definite: Classi Astratte e Interfacce

Похожие документы
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

16 - Ereditarietà, tipi e gerarchie

La classe java.lang.object

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

14 - Metodi e Costruttori

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Programmazione orientata agli oggetti Classi astratte e interfacce

5 - Istruzioni condizionali

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Proprietà delle Classi e degli Oggetti in Java

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

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

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

8 - Stringhe (e altre classi dalla Libreria Standard di Java)

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Il Linguaggio Java. Le interfacce

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

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esempi in Java di program.ne O-O

Esempio 2: Subtyping

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Uso di metodi statici. Walter Didimo

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

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

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

20 - Input/Output su File

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Riassunto. La programmazione OO. Oggi. Esempio

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

Gerarchia di classi Java 1

Lezione 13 Classi interne

Programmazione a oggetti

Esempio: Interfacce. Gioco Interfacce

Uguaglianza e copia di oggetti

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

Esempio: Interfacce. Gioco Interfacce

Definizione di classi. Walter Didimo

Ereditarietà e Polimorfismo

22 - Strutture Dati (Java Collections Framework)

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

10 - Programmare con gli Array

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Programmazione Java Avanzata PATTERN

GESTIONE DEGLI ERRORI

CLASSI ASTRATTE - ESERCIZIO

Eredità e Polimorfismo in Java

21 - Alberi e Ricorsione

Multithreading in Java I parte. Lorenzo Gallucci

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Implementazione Java di un ADT

23 - Graphical User Interface GUI (Cenni)

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Транскрипт:

18 - Classi parzialmente definite: Classi Astratte e Interfacce Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea Magistrale in Informatica Umanistica A.A. 2013/2014 Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 1 / 21

Ereditarietà come meccanismo di astrazione (1) L esempio delle classi Persona-Studente-Professore mostra come usando l ereditarietà si possono raggruppare informazioni comuni a più classi. Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 2 / 21

Ereditarietà come meccanismo di astrazione (2) Ogni tanto, però, questo meccanismo di raggruppamento delle informazioni comuni a più classi porta ad ottenere classi che non sono ben definite... Supponiamo di avere le seguenti classi Sfera e Cubo public class Sfera { private double raggio ; private double pesospecifico ; public Sfera ( double raggio, double ps) { this. raggio = raggio ; pesospecifico = ps; public double volume () { return 4/3 * Math. PI * Math. pow ( raggio,3); public double superficie () { return 4 * Math. PI * raggio * raggio ; public double peso () { return pesospecifico * volume (); Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 3 / 21

Ereditarietà come meccanismo di astrazione (3) public class Cubo { private double lato ; private double pesospecifico ; public Cubo ( double lato, double ps) { this. lato = lato ; pesospecifico = ps; public double volume () { return Math. pow (lato,3); public double superficie () { return 6* lato * lato ; public double peso () { return pesospecifico * volume (); Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 4 / 21

Ereditarietà come meccanismo di astrazione (4) Le classi Sfera e Cubo hanno diverse cose in comune Potremmo quindi pensare di creare una classe Solido che raggruppa i membri comuni di Sfera e Cubo La classe Solido dovrebbe contenere: la variabile pesospecifico il metodo peso() identico nelle due classi (e che quindi potrebbe essere ereditato senza overriding) i metodi volume() e superficie(), per due motivi: tutti i solidi hanno un volume e una superficie il metodo peso() invoca volume() Ma come si calcolano superficie e volume di un solido generico? non si può fare... ogni solido ha le sue formule... Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 5 / 21

Classi Astratte (1) Soluzione: Definire i volume() e superficie() come metodi astratti Un metodo astratto è un metodo che prevede solo una intestazione, ma che non è implementato Una classe che contiene (almeno) un metodo astratto è una classe astratta Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 6 / 21

Classi Astratte (2) Ecco la classe astratta Solido: public abstract class Solido { // classe astratta private double pesospecifico ; public Solido ( double ps ){ pesospecifico = ps; public double peso (){ return volume () * pesospecifico ; public abstract double volume (); // metodo astratto public abstract double superficie (); // metodo astratto Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 7 / 21

Classi Astratte (3) Nella classe astratta Solido Viene definita tramite il modificatore abstract (prima di class) Il modificatore abstract viene usato anche nei metodi astratti I metodi astratti consistono della sola intestazione seguita da ; Nel metodo peso() si può richiamare volume() anche se è astratto Una classe astratta non può essere usata per creare oggetti (la classe non è completa...) Solido x = new Solido () // ERRORE può solo essere estesa da un altra classe che ne definisce i metodi astratti (tramite overriding) può prevedere costruttori che saranno richiamati dalle sottoclassi (tramite super) Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 8 / 21

Classi Astratte (4) Ridefinamo le classi Sfera e Cubo Aggiungiamo anche un metodo tostring() public class Sfera extends Solido { private double raggio ; // pesospecifico e definito nella superclasse public Sfera ( double raggio, double ps) { super (ps ); this. raggio = raggio ; public double volume () { return 4/3 * Math. PI * Math. pow ( raggio,3); public double superficie () { return 4 * Math. PI * raggio * raggio ; // peso () e definito nella superclasse public String tostring (){ return " Sfera ("+ raggio +")";

Classi Astratte (5) public class Cubo extends Solido { private double lato ; // pesospecifico e definito nella superclasse public Cubo ( double lato, double ps) { super (ps ); this. lato = lato ; public double volume () { return Math. pow (lato,3); public double superficie () { return 6* lato * lato ; // peso () e definito nella superclasse public String tostring (){ return " Cubo ["+ lato +"]"; Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 10 / 21

Classi Astratte (6) E ora un main... import java. util. Scanner ; public class UsaSolido { public static void main ( String args []) { Scanner input = new Scanner ( System. in ); System. out. println (" Vuoi creare una sfera o un cubo (s/c)?"); char scelta = input. nextline (). charat (0); if ( scelta == s scelta == c ) { System. out. print (" Peso Specifico? "); double ps = input. nextdouble (); Solido sol ; // variabile di tipo Solido if ( scelta == s ) { System. out. print (" Raggio? "); double raggio = input. nextdouble (); sol = new Sfera ( raggio, ps ); else { System. out. print (" Lato? "); double lato = input. nextdouble (); sol = new Cubo ( lato, ps ); System. out. println ( "Ho creato un solido " + sol + " con volume " + sol. volume () + " e peso " + sol. peso () );

Dalle Classi Astratte alle Interfacce (1) Abbiamo visto che le classi astratte includono metodi astratti una classe astratta è definita solo parzialmente Esasperando l uso dei metodi astratti potremmo avere una classe astratta dotata solo di metodi astratti // descrive prodotti commerciabili public abstract class ProdottoPrezzato { // restituisce una descrizione del prodotto public abstract double getdescrizione (); // restituisce il prezzo del prodotto public abstract double getprezzo (); Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 12 / 21

Dalle Classi Astratte alle Interfacce (2) Una classe che consiste di soli metodi astratti (o anche costanti) può essere meglio descritta tramite una interfaccia // non e una classe... e una interfaccia public interface ProdottoPrezzato { // restituisce una descrizione del prodotto public String getdescrizione (); // restituisce il prezzo del prodotto public double getprezzo (); Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 13 / 21

Interfacce (1) Un interfaccia si definisce in maniera simile a una classe astratta, ma: è costituita da soli metodi astratti (è completamente non definita) non usa il modificatore abstract usa la parola chiave interface al posto di class Inoltre, una classe che implementa i metodi dell interfaccia deve usare la parola chiave implements invece che extends public class DVD extends ProdottoPrezzato { // NO!!! public class DVD implements ProdottoPrezzato { // OK!!! Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 14 / 21

Interfacce (2) Un esempio di uso: public class DVD implements ProdottoPrezzato { private String descrizione ; private static double PREZZO = 19.90; public DVD ( String descrizione ) { this. descrizione = descrizione ; public String getdescrizione () { return descrizione ; public double getprezzo () { return PREZZO ; Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 15 / 21

Interfacce (3) Un altro esempio: public class Farina implements ProdottoPrezzato { private double prezzoalkg ; private double peso = 0.0 public Farina ( double prezzoalkg ) { this. prezzoalkg = prezzoalkg ; public String getdescrizione () { return " Farina "; public void setpeso ( double peso ) { if (peso >0) this. peso = peso ; public double getprezzo () { return prezzoalkg * peso ; Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 16 / 21

Interfacce (4) Ma... che vantaggio offrono le interfacce rispetto alle classi astratte? Una classe può estendere una sola classe (astratta o meno) Una classe può implementare tante interfacce Ad esempio, consideriamo un altra interfaccia: public interface ProdottoPesabile { public void setpeso ( double peso ); Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 17 / 21

Interfacce (5) Possiamo modificare Farina indicando anche l interfaccia ProdottoPesabile dopo implements public class Farina implements ProdottoPrezzato, ProdottoPesabile { private double prezzoalkg ; private double peso = 0.0 public Farina ( double prezzoalkg ) { this. prezzoalkg = prezzoalkg ; public String getdescrizione () { return " Farina "; public void setpeso ( double peso ) { if (peso >0) this. peso = peso ; public double getprezzo () { return prezzoalkg * peso ; Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 18 / 21

Interfacce (6) Come si usano gli oggetti di classi che implementano determinate interfacce? Esempio: La classe Scontrino usa oggetti che implementano ProdottoPrezzato public class Scontrino {... // altri membri public void aggiungiprodotto ( ProdottoPrezzato x) {... this. totscontrino += x. getprezzo ();... Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 19 / 21

Interfacce (7) Altro esempio: La classe Bilancia usa oggetti che implementano ProdottoPesabile public class Bilancia {... // altri membri public void pesa ( ProdottoPesabile x) {... double peso = leggipeso (); // metodo ausiliario x. setpeso ( peso );... Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 20 / 21

Interfacce (8) Grazie al fatto che una classe può implementare più interfacce, nell esempio abbiamo che gli oggetti della classe Farina possono essere usati sia da Scontrino che da Bilancia Gli oggetti della classe DVD invece possono essere usati solo da Scontrino Per concludere, i meccanismi dell ereditarietà (extends) e delle interfacce (implements) possono essere usati insieme public class Salame extends Affettato implements ProdottoPesabile, ProdottoPrezzato {... Paolo Milazzo (Università di Pisa) Programmazione - Cl. Astratte e Interfacce A.A. 2013/2014 21 / 21