Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Slides:



Advertisements
Presentazioni simili
© 2007 SEI-Società Editrice Internazionale, Apogeo Unit à B2 Gli oggetti: concetti avanzati.
Advertisements

Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Overriding.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
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)
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Esercitazione del 7 marzo 2008 Ereditarieta’. Esercizio: soluzione Implementare la seguente specifica che definisce un tipo di dato Libro.
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.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
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.
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.
Table View. Problemi ricorrenti Una situazione ricorrente è quella in cui il controller potrebbe avere un’altezza superiore a quella dello schermo. In.
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Programmazione orientata agli Oggetti. Classi Le classi sono uno strumento per costruire strutture dati che contengano non solo dati ma anche il codice.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
LA CLASSIFICAZIONE DIMENSIONI DEL CONCETTO DI CLASSIFICAZIONE (Marradi, ) classificazione a: operazione intellettuale con cui l’estensione di.
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Tecnologia OO.
ODMG.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning
Dal problema al processo risolutivo
Generazione di codice dinamico per la realizzazione di catene di servizi componibili Matteo Fazi – matr
Raccolta ed Analisi dei Requisiti nella Progettazione
Dal problema al processo risolutivo
Programmazione a oggetti
Programmazione a oggetti
UML Creato da: Enrico Tarantino Alessandro Vilucchi Roberta Barcella.
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Asynchronous JavaScript and XML
Programmazione ad Oggetti per la Fisica
Gli oggetti: concetti avanzati
FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a. a
OBJECT ORIENTED DATABASE
Statistica Scienza che studia i fenomeni collettivi.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Package Pacchetti e ereditarietà 29/12/2018 package.
Progettazione concettuale
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Oggetti Java.
Copia di oggetti il costruttore di copia ha le stesse particolarità della signature di un costruttore ordinario; il primo parametro è una reference ad.
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
TDE
Ricorsione 16/01/2019 package.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
Paradigma di programmazione event-driven
Strategie di progetto Si possono utilizzare le strategie tipiche dello sviluppo di un processo di ingegnerizzazione (es. ingegneria del software). Strategie.
Interfacce in Java Superare il meccanismo dell’ereditarietà singola
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
UML Diagramma statico di una classe
Array e Stringhe Linguaggio C.
Ese 1 (del 31 Marzo 2004).
LA CLASSIFICAZIONE DIMENSIONI DEL CONCETTO DI CLASSIFICAZIONE (Marradi, ) classificazione a: operazione intellettuale con cui l’estensione di.
Corso di Fondamenti di Informatica
Vincoli di Integrità Non tutte le combinazioni possibili di valori dei domini su cui è definita una relazione sono accettabili. Alcuni attributi possono.
Transcript della presentazione:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 25 Ereditarietà A. Miola Maggio 2011 http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Contenuti Livelli di astrazione ed ereditarietà Estensione di classi Polimorfismo La classe Object Classi astratte Interfacce http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Alcune riflessioni Riprendiamo alcune riflessioni fatte in precedenza Cosa è il tipo Object ? Che relazione c’è tra il tipo astratto Q dei numeri razionali e il tipo astratto Coppia ? Il tipo Q è un caso particolare di Coppia Che relazione c’è tra la classe Razionale e la classe Coppia ? In che senso la classe Razionale può essere intesa come un caso particolare della classe Coppia ? Cosa vuol dire in Java che una classe è un caso particolare di un’altra classe ? Per rispondere a queste domande dobbiamo introdurre il concetto di ereditarietà e i relativi meccanismi di realizzazione http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Ereditarietà Una delle caratteristiche distintive del paradigma di programmazione orientato agli oggetti è l’ereditarietà l’ereditarietà permette di definire nuove classi mediante l’aggiunta e/o la specializzazione di funzionalità ad altre classi, già esistenti oppure appositamente progettate e definite Il linguaggio Java fornisce tre meccanismi (costrutti linguistici) di ereditarietà estensione di classi classi astratte interfacce http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Estensione di classi . . . L’estensione (o derivazione) di classi è il meccanismo che permette di definire una classe (per istanziare oggetti) a partire da un’altra classe mediante l’aggiunta e/o la specializzazione di funzionalità la classe “di partenza” è chiamata classe base oppure super-classe la nuova classe che viene definita è chiamata classe estesa o derivata oppure sotto-classe http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Estensione di classi Tutte le proprietà e le operazioni definite dalla classe base sono implicitamente definite anche nella classe estesa che le eredita la classe estesa può definire delle nuove proprietà e nuove funzionalità per i propri oggetti la classe estesa può ri-definire le funzionalità già definite nella classe base Ogni oggetto istanza della classe estesa può essere considerata anche un oggetto istanza della classe base http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Esempio — la classe Persona. . . Si consideri la seguente classe Persona Un oggetto Persona rappresenta una persona L’unica proprietà di una Persona è il suo nome nome è una variabile d’istanza (privata) È possibile costruire un nuovo oggetto Persona che ha un certo nome la classe Persona ha un costruttore parametrico rispetto al nome http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Esempio — la classe Persona A una Persona è possibile chiedere il suo nome il metodo (d’istanza) pubblico String getNome() restituisce il nome della Persona A una Persona è possibile chiedere una sua descrizione il metodo (d’istanza) pubblico String toString() restituisce un descrizione della Persona Si può verificare l’uguaglianza tra oggetti Persona con il metodo (d’istanza) pubblico equals http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

La classe Persona . . . /** Un oggetto Persona rappresenta una persona. */ class Persona { /** Il nome. */ private String nome; /** Crea una Persona, dato il nome. */ public Persona(String nome) { this.nome = nome; } . . . Segue . . . http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . La classe Persona . . . Segue . . . /** Restituisce il nome della Persona. */ public String getNome() { return nome; } /** Restituisce una descrizione. */ public String toString() { return "Mi chiamo " + getNome() + ".";} /** Verifica l’uguaglianza. */ public boolean equals(Persona p) { return this.nome.equals(p.nome); } } http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Esempio — la classe Studente . . . Si supponga ora di voler definire la seguente classe Studente Un oggetto Studente rappresenta uno studente universitario le proprietà di uno Studente sono il suo nome e il nome dell’università in cui studia È possibile costruire un nuovo Studente che ha un certo nome e studia in una certa università la classe Studente ha un costruttore parametrico rispetto al nome e all’università http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Esempio — la classe Studente A uno Studente è possibile chiedere il suo nome e l’università in cui studia nonché una sua descrizione con i metodi String getNome() che restituisce il nome dello Studente String getUniversità() che restituisce l’università dello Studente String toString() che restituisce un descrizione dello Studente A uno Studente è possibile chiedere di verificare l’uguaglianza con un altro Studente con il metodo (d’istanza) pubblico equals http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Dalla classe Persona alla classe Studente Si osservi come la classe Studente estenda e specializzi il comportamento della classe Persona La classe Studente serve a modellare degli oggetti che sono “casi particolari” della classe Persona un oggetto Studente sa eseguire tutte le operazioni degli oggetti Persona un oggetto Studente sa eseguire anche delle ulteriori operazioni, che gli oggetti Persona non sanno eseguire http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Dalla classe Persona alla classe Studente In Java è possibile definire la classe Studente a partire dalla definizione della classe Persona aggiungendo nuove proprietà e nuove funzionalità ri-definendo funzionalità già definite nella classe base La classe Studente è una sotto-classe della classe Persona La classe Persona è una super-classe della classe Studente Nella classe Studente continuano ad essere valide tutte le funzionalità della classe Persona che non vengono ridefinite http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

La classe Studente . . . /** Un oggetto Studente rappresenta uno studente. */ class Studente extends Persona { /** L'università. */ private String università; /** La proprietà nome viene ereditata dalla classe Persona e quindi non va definita la variabile d’istanza nome. */ /** Crea uno Studente, dati nome e università. */ public Studente(String nome, String università) { super(nome); // invoca il costruttore di Persona this.università = università; } http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . La classe Studente . . . /** Restituisce l'università dello Studente. */ public String getUniversità() { return università; } /** Il metodo getNome viene ereditato dalla classe Persona e quindi non va definito. */ /** Inserire le definizioni dei metodi d’istanza toString e equals. */ http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . La classe Studente . . . La classe estesa può ridefinire i metodi della classe base se ne vuole modificare la definizione (overriding o sovrascrittura) Questo è il caso dei metodi toString e equals che possono essere definiti come segue http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . La classe Studente /** Restituisce una descrizione dello Studente. */ public String toString() { return "Mi chiamo " + getNome() + ". " + "Studio a " + getUniversità() + "."; /** Verifica l’uguaglianza tra oggetti Studente. */ public boolean equals(Studente s) { return this.getNome.equals(s.getNome) && this.getUniversita.equals(s.getUniversita); } http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Uso delle classi Persona e Studente . . . Gli oggetti della classe derivata sono compatibili con gli oggetti della classe base – ma non viceversa Un oggetto Studente è anche una istanza della classe Persona Un oggetto Persona non è una istanza della classe Studente Non tutte le persone sono studenti La classe estesa modella un insieme di oggetti che è un sottoinsieme degli oggetti modellati dalla classe base http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Uso delle classi Persona e Studente . . . Il seguente frammento di codice mostra un esempio di uso degli oggetti Persona e Studente Persona mario = new Persona("Mario"); Studente paola = new Studente("Paola", "Roma Tre"); Persona p; Studente s; p = paola // OK! Studente e’ compatibile con Persona s = mario // NO! Persona non e’ compatibile con Studente . . . Segue . . . http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Uso delle classi Persona e Studente System.out.println(mario.getNome()); // Mario System.out.println(mario.toString());// Mi chiamo Mario. /* OK! getNome e toString sono metodi di Persona */ System.out.println(paola.getNome()); // Paola System.out.println(paola.getUniversità()); // Roma Tre /* OK! getNome e getUniversità sono metodi di Studente */ System.out.println(mario.getUniversità()); /* NO! getUniversità e’ un metodo di Studente */ System.out.println(paola.toString()); // Mi chiamo Paola. Studio a Roma Tre. /* OK! toString e’ un metodo di Studente * sovrascritto a quello omonimo di Persona */ http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Polimorfismo . . . L’aspetto fondamentale dell’estensione di classe (e dell’ereditarietà in generale) è il polimorfismo per polimorfismo si intende la possibilità di assegnare il riferimento a un oggetto della classe estesa a una variabile il cui tipo è la classe base – ad esempio … Persona mario = new Persona("Mario"); Studente paola = new Studente("Paola", "Roma Tre"); Persona p; Studente s; p = paola // OK! Studente e’ compatibile con Persona s = mario // NO! Persona non e’ compatibile con Studente http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Polimorfismo . . . Il polimorfismo consente di assegnare il riferimento a un oggetto della classe estesa a una variabile il cui tipo è la classe base a tale oggetto è possibile richiedere solo il comportamento dichiarato dalla classe base tuttavia, il comportamento dell’oggetto viene scelto sulla base del tipo effettivo dell’oggetto, e non sul tipo della variabile (late binding) ciò implica che se sull’oggetto viene invocato un metodo che è sovrascritto nella classe derivata allora viene usato il metodo sovrascritto http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Polimorfismo Ad esempio con rifetimento alle classi Persona e Studente Persona paola; paola = new Studente("Paola", "Roma Tre"); System.out.println(paola.toString()); // Mi chiamo Paola. Studio a Roma Tre. // e non: Mi chiamo Paola. // toString e’ definito anche in Persona System.out.println(paola.getUniversità()); // NO, ERRORE (IN COMPILAZIONE)! // getUniversità non e’ definito in Persona http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Polimorfismo e parametri . . . In modo simile, nell’invocazione di un metodo che ha un parametro del tipo della classe base, è possibile usare come parametro attuale il riferimento a un oggetto istanza della classe estesa a tale oggetto è possibile richiedere solo il comportamento dichiarato dalla classe base tuttavia, il comportamento dell’oggetto viene scelto sulla base del tipo effettivo dell’oggetto (parametro attuale), e non sul tipo della variabile (parametro formale) http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Polimorfismo e parametri Ad esempio definizione del metodo public static void stampa(Persona p) { System.out.println(p.toString()); } invocazione del metodo stampa( new Studente("Marco", "Roma Tre") ); // Mi chiamo Marco. Studio a Roma Tre. il parametro formale del metodo stampa è di tipo Persona che viene legato al parametro attuale che è di tipo Studente http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Conversione esplicita . . . Si consideri nuovamente il caso di una variabile del tipo della classe base che memorizza il riferimento a un oggetto se si è sicuri che la variabile memorizza il riferimento a un oggetto istanza della classe estesa, allora è possibile effettuare una conversione esplicita (cast) del riferimento, per ottenere un riferimento del tipo della classe estesa la conversione permette di utilizzare il comportamento specifico della classe estesa la conversione esplicita genera una eccezione se l’oggetto referenziato non ha il tipo della classe a cui si converte http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Conversione esplicita Ad esempio Persona johnP; // john come Persona Studente johnS; // john come Studente johnP = new Studente("John", "Stanford"); johnS = (Studente) johnP; // ok System.out.println(johnS.getUniversità());// ok System.out.println(johnP.getUniversità());// NO http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

La classe Object . . . In Java, tutte le classi estendono (direttamente o indirettamente) la classe Object definita nella API di Java (in java.lang) la classe Object è la super-classe per tutte le altre classi (già definite in Java o definite dall’utente) la classe Object definisce un comportamento comune per tutti gli oggetti istanza tutte le classi ereditano questo comportamento comune — ma possono ridefinirlo se necessario http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . La classe Object Ad esempio, la classe Object definisce il metodo boolean equals(Object altro) per verificare se due oggetti sono uguali nell’implementazione di Object, due oggetti sono uguali se sono identici (ovvero, se sono lo stesso oggetto) ogni classe in cui è significativa una nozione di uguaglianza (diversa dall’identità) deve ridefinire questo metodo si pensi ad esempio alla classe String http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Estensione di classi e progettazione di classi L’estensione di classi è una tecnica da utilizzare quindi nella progettazione di un insieme di classi che condividono alcune funzionalità solitamente, si procede prima progettando la gerarchia delle classi che si vogliono definire, ciascuna con le proprie funzionalità, e poi implementando le varie classi, dalle super-classi verso le sotto-classi per decidere se una classe può essere definita come l’estensione di un’altra classe, viene seguito il seguente criterio la classe estesa deve modellare un insieme di oggetti che è un sottoinsieme degli oggetti modellati dalla classe base si pensi ad esempio alle classi Persona e Studente http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Il modificatore protected . . . Nella definizione di gerarchie di classi, l’uso dei soli modificatori public e private è troppo restrittivo spesso è utile permettere a una classe estesa di accedere alle componenti “private” della classe base, senza che queste componenti siano rese accessibili a tutti gli altri oggetti questa modalità di accesso non può essere definita utilizzando i modificatori public e private In questi casi può essere utilizzato il modificatore protected http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Il modificatore protected In questi casi può essere utilizzato il modificatore protected un componente (variabile o metodo) dichiarato protected in una classe C può essere acceduto dalle classi che estendono C il modificatore protected offre un livello di restrizione dell’accesso intermedio tra public e private nella definizione di classi da estendere, viene spesso utilizzato il modificatore protected anziché il modificatore private http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Classi astratte . . . Una classe astratta è una classe implementata in modo parziale una classe astratta è una classe che contiene la dichiarazione di alcuni metodi (metodi astratti), di cui viene specificata solo l’intestazione ma non il corpo una classe astratta non può essere istanziata, appunto perché definita in modo incompleto le classi astratte sono progettate per essere estese da classi che forniscono delle opportune implementazioni per i metodi astratti http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Classi astratte Le classi astratte sono utili nella definizione di una gerarchia di classi, in cui la super-classe (astratta) viene definita con i seguenti scopi definire il comportamento comune per tutte le classi della gerarchia dichiarare (senza implementare) le funzionalità che devono essere implementate da tutte le classi che la estendono http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Esempio Si vogliono definire delle classi i cui oggetti rappresentano delle forme geometriche ad esempio, le classi Quadrato e Cerchio per rappresentare rispettivamente quadrati e cerchi le caratteristiche delle forme geometriche sono le seguenti i quadrati sono caratterizzati da un lato e da un colore i cerchi sono caratterizzati da un raggio e da un colore i quadrati devono saper calcolare il proprio lato, il proprio colore e la propria area i cerchi devono saper calcolare il proprio raggio, il proprio colore e la propria area Viene definita la classe (astratta) Forma che dichiara e/o definisce tutte le caratteristiche comuni delle classi Quadrato e Cerchio http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

La classe astratta Forma /** Una forma geometrica. */ abstract class Forma { /** Il colore della forma. */ protected String colore; /** Crea una nuova Forma di un certo colore. */ public Forma(String colore) { this.colore = colore; } /** Restituisce il colore della forma. */ public String getColore() { return colore; } /** Restituisce l'area della forma. */ public abstract double getArea(); // ogni forma deve saper calcolare la propria area } http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

La classe Quadrato /** La forma geometrica quadrato. */ class Quadrato extends Forma { /** Il lato del quadrato. */ protected double lato; /** Crea una nuovo Quadrato. */ public Quadrato(double lato, String colore) { super(colore); this.lato = lato; } /** Restituisce il lato del quadrato. */ public double getLato() { return lato; } /** Restituisce l'area del quadrato. */ // implementa il metodo astratto area() public double getArea() { return lato*lato; } } http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

La classe Cerchio /** La forma geometrica cerchio. */ class Cerchio extends Forma { /** Il raggio del cerchio. */ protected double raggio; /** Crea una nuovo Cerchio. */ public Cerchio(double raggio, String colore) { super(colore); this.raggio = raggio; } /** Restituisce il raggio del cerchio. */ public double getRaggio() { return raggio; } /** Restituisce l'area del cerchio. */ // implementa il metodo astratto area() public double gatArea() { return raggio*raggio*Math.PI; } } http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Uso di forme geometriche Quadrato q; // un quadrato Forma fq; // un altro quadrato q = new Quadrato(5, "bianco"); // lato 5 e colore bianco fq = new Quadrato(10, "rosso"); // lato 10 e colore rosso System.out.println(q.getArea()); // 25 System.out.println(q.getColore()); // bianco System.out.println(q.getLato()); // 5 System.out.println(fq.getArea()); // 100 System.out.println(fq.getColore()); // rosso System.out.println(fq.getLato()); // NO, errore // di compilazione! http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Classi astratte e polimorfismo . . . Caratteristiche dell’esempio mostrato la classe Forma è stata dichiarata abstract perché contiene la dichiarazione del metodo astratto area() la classe astratta Forma non può essere istanziata direttamente le classi Quadrato e Cerchio sono “concrete” perché estendono la classe Forma e ne implementano tutti i metodi astratti le classi Quadrato e Cerchio possono essere istanziate http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

. . . Classi astratte e polimorfismo Una variabile di tipo Forma può memorizzare il riferimento a una forma (un quadrato o un cerchio) può essere usata per invocare un metodo definito da Forma — ad esempio, colore() può essere usata per invocare un metodo astratto dichiarato da Forma — ad esempio, area() http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Interfacce In Java, una interfaccia (interface) è una unità di programmazione che consiste nella dichiarazione di un certo numero di metodi d’istanza e pubblici, che sono implicitamente astratti in prima approssimazione, una interfaccia è simile a una classe astratta che dichiara solo metodi astratti, senza fornire alcuna implementazione Una classe implementa una interfaccia se implementa (definisce) tutti i metodi d’istanza dichiarati dall’interfaccia http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Esercizi Riesaminare le domande poste inizialmente circa il tipo Razionale e il tipo Coppia Definire il tipo Coppia e il tipo Razionale utilizzando i meccanismi di ereditarietà visti Definire il tipo Complesso come sottotipo del tipo Coppia http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà

Riferimenti Per ulteriori approfondimenti si può fare riferimento al Capitolo 25 del libro di testo http://www.dia.uniroma3.it/~java/fondinf/ Ereditarietà