18 - Classi parzialmente definite: Classi Astratte e Interfacce

Documenti analoghi
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

24 - Possibili approfondimenti

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

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

5 - Istruzioni condizionali

Informazioni sull esame e Regole per lo svolgimento dei progetti

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione II Compitino (Vers. B)

Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

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

Classi astratte. Nella gerarchia delle classi, potrebbe essere utile prevedere un supertipo generale per le classi che si usano. Ad esempio: Figura

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

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Esempi in Java di program.ne O-O

4 - Tipi di dato primitivi

Esempio 2: Subtyping

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }

Programmazione Java Avanzata Programmazione Object- Oriented in Java

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

Catia Trubiani. Laboratorio di Ingegneria del Software a.a

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

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

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Capitolo 6. Uso della gerarchia. c 2005 Pearson Education Italia Capitolo 6-1 / 125

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Ereditarietà (ultima)

20 - Input/Output su File

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

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

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

Riassunto. La programmazione OO. Oggi. Esempio

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

Java: Definire Classi e Creare Oggetti

Gerarchia di classi Java 1

Introduzione alla Java Collections Framework

Lezione 13 Classi interne

Obiettivi. Comprendere i vantaggi offerti dal meccanismo dell ereditarietà Attivare processi di astrazione e specializzazione.

Programmazione a oggetti

Esempio: Interfacce. Gioco Interfacce

Fondamenti di Informatica T-1

L ereditarieta` Riuso del software: Ereditarieta`, Composizione, Polimorfismo e Binding Dinamico Ereditarietà Ereditarietà

Uguaglianza e copia di oggetti

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

Esempio: Interfacce. Gioco Interfacce

Programmazione II Compitino (Vers. B)

Definizione di classi. Walter Didimo

OCA JAVA 8 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

RICHIAMI DI PROGRAMMAZIONE A OGGETTI. Corso di Informatica Medica

Ereditarietà e Polimorfismo. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Programmazione ad oggetti

Ereditarietà e Polimorfismo

22 - Strutture Dati (Java Collections Framework)

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

Corso di Fondamenti di Informatica I

10 - Programmare con gli Array

Oggetti e classi. Cos è un oggetto

Esercitazione n 3. Capacità di analisi e di estensione di progetti esistenti Linguaggio Java:

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

Programmazione Java Avanzata PATTERN

Definizione di metodi

GESTIONE DEGLI ERRORI

Programmazione a Oggetti. Ereditarieta

Classi, Ereditarietà e Polimorfismo. Lezione 7

public double getlato() restituisce la lunghezza del lato del quadrato che esegue il metodo.

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

CLASSI ASTRATTE - ESERCIZIO

CloneNotSupportedException clone() Object clone() protected native Object clone() throws CloneNotSupportedException this

Programmazione orientata agli oggetti Ereditarietà

Oggetti Composti (1) Oggetti Composti (2)

Eredità e Polimorfismo in Java

Concetto di Funzione e Procedura METODI in Java

public protected private private package

21 - Alberi e Ricorsione

Multithreading in Java I parte. Lorenzo Gallucci

Introduzione all uso degli oggetti in Java (parte II) Walter Didimo

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

Implementazione Java di un ADT

Programmazione ad Oggetti

23 - Graphical User Interface GUI (Cenni)

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

Laboratorio di Matematica e Informatica 1

Transcript:

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