Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili

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

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

La classe java.lang.object

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()

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

Esempi in Java di program.ne O-O

ereditarietà e polimorfismo

Ereditarietà: concetti di base

Concetti principali Ereditarietà e (overriding) di metodi. Ereditarietà e costruttori Livelli di accesso protected e package La classe Object

Bank account. private double balance; 11/2/2011

Ereditarietà. Ivan Lanese e Cosimo Laneve

Overloading - Overriding

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

Programmazione orientata agli oggetti Classi astratte e interfacce

Programmazione Orientata agli Oggetti in Linguaggio Java

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Gerarchia di classi Java 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

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

INFORMATICA OOP Relazioni tra classi Roberta Gerboni

OOP Ereditarietà A. FERRARI

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Informatica Ereditarietà Java. Ereditarietà

Programmazione II. Lezione 18. Daniele Sgandurra 11/1/2011.

RIUSABILITÀ L OBIETTIVO

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I {

JAVA GENERICS. Angelo Di Iorio Università di Bologna

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

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

Principi di Progettazione del Software a.a

Programmazione ad oggetti

Paradigmi della PO. Incapsulamento. Ereditarietà. Polimorfismo. Software per TLC - AA 2008/2009 1

Autovalutazione. OO in Java: classi astratte, interfacce, classi interne. Riassunto: cos è la OOP?

Ereditarietà e Polimorfismo

Esempio 2: Subtyping

Classi astratte Interfacce

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

Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2)

Ereditarietà (ultima)

Ereditarietà (ultima)

Informatica 3. Informatica 3. LEZIONE 8: Fondamenti di programmazione orientata agli oggetti (2) Lezione 8 - Modulo 1

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

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

Esonero del corso di Programmazione a Oggetti

Progettazione Object-Oriented

Introduzione. Java. Esempio. Esempio

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

RETI DI CALCOLATORI Linguaggio Java: Ereditarietà

Gerarchia delle classi Classi astratte Interfacce (Eccezioni) Laboratorio di Programmazione - Esercitazio 1

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio

Laboratorio di Sistemi Polimorfismo Java. Prerequisiti: per la comprensione dell'articolo è necessario conoscere il concetto di Ereditarietà in Java.

DataSet. Interfacce e Polimorfismo. DataSet per BankAccount. DataSet per BankAccount. DataSet per Coin. DataSet per Coin

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

IL CONCETTO DI CLASSE

Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo

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

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

Gerarchia di classi Java 1

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

Classi, Ereditarietà e Polimorfismo. Lezione 7

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Programmazione ad oggetti

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

Polimorfismo. Subtyping-polimorfismo

Inizializzare oggetti

Ereditarietà. Unità 9. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Ereditarietà. Una classe, detta superclasse, può essere specializzata definendo una sottoclasse che ne contenga casi particolari.

Classi ed Oggetti. Fondamenti di Informatica A-K

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

Determinazione del tipo

Proprietà delle Classi e degli Oggetti in Java

Corso di Linguaggi di Programmazione

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

Fondamenti di Informatica T-1

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

Programmazione a oggetti

Esempio: Interfacce. Gioco Interfacce

e il loro uso: Oggetti composti IL TEMA DELLA RIUSABILITÀ APPROCCI PER IL RIUTILIZZO:

Principi di Progettazione del Software. Principi di Progettazione del Software a.a

Proprietà delle Classi e degli Oggetti in Java

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

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

Linguaggi di Programmazione I Lezione 12

Scelte. Costrutto condizionale. Il costrutto if. Il costrutto if. Rappresentazione con diagramma a blocchi. Il costrutto if

Implementare un'interfaccia

Fondamenti di Informatica T-1. Ereditarietà & Polimorfismo

Java: Definire Classi e Creare Oggetti

PRINCIPI DELLA OOP. Ereditarietà e polimorfismo

Strutture come parametri di funzioni

Esercizi Interfacce Ereditarietà

Transcript:

Riuso di classi Spesso si ha bisogno di classi simili Si vuole cioè riusare classi esistenti per implementare attributi e metodi leggermente diversi Non è pratico copiare la classe originaria e modificarne attributi o metodi Proliferazione di classi Il programmatore deve fare tante attività Il riuso delle classi esistenti deve avvenire Senza dover modificare codice esistente (e funzionante) In modo semplice per il programmatore E. Tramontana - Marzo 2018 1 Attraverso l ereditarietà è possibile Definire una nuova classe indicando solo cosa ha in più rispetto ad una classe esistente Esempio E possibile aggiungere attributi e metodi nuovi E possibile modificare metodi esistenti Una classe Persona ha nome e cognome (più vari metodi) La classe Studente dovrebbe avere tutto ciò che Persona fornisce (attributi e metodi) ed inoltre nuovi attributi e metodi Studente aggiunge esami, voti, etc. La classe Studente eredita da Persona public class Studente extends Persona {... Studente è sottoclasse di Persona Persona è superclasse di Studente E. Tramontana - Marzo 2018 2 La sottoclasse Eredita tutti i metodi e gli attributi della superclasse e può usarli come se fossero definiti localmente Aggiunge altri metodi Può ridefinire i metodi della superclasse Non può eliminare metodi o attributi della superclasse Esempio La classe Studente Può usare tutti i metodi della classe Persona, es. setnome() Può aggiungere metodi, es. getmedia() E. Tramontana - Marzo 2018 3 public class Persona { private String nome, cognome; public void setnome(string n, String c) { nome = n; cognome = c; public void printall() { System.out.println("Nome: "+ nome+" "+cognome); Persona + setnome(string n, String c) + printall() Studente + nuovoesame(string e, int v) + getmedia() : float + printall() public class Studente extends Persona { private HashMap<String, Integer> tab = new HashMap<String, Integer>(); public void nuovoesame(string e, int v) { tab.put(e, v); public float getmedia() { if (tab.size() == 0) return 0; float sum = 0; for (int voto : tab.values()) sum += voto; return sum / tab.size(); public void printall() { super.printall(); for (String esame : tab.keyset()) System.out.println("esame: " + esame + " voto: " + tab.get(esame)); System.out.println("media = " + getmedia()); E. Tramontana - Marzo 2018 4

Visibilità Ciò che è private è visibile solo alla classe, non alla sottoclasse Ciò che è public è visibile a tutti, anche alla sottoclasse Se voglio far vedere qualche metodo o attributo alle sottoclassi ma non a tutti Uso protected Il nome della sottoclasse deve comunicare a quale classe è simile e come è diversa Sottoclassi che servono come radici di una gerarchia devono avere nomi concisi, altrimenti si può dare un nome più lungo Classi astratte Una classe astratta è una classe parzialmente implementata Alcuni metodi sono implementati, altri no (sono dichiarati abstract) E utile avere un metodo abstract (senza implementazione) Altri metodi della stessa classe (implementati) possono invocarlo I client si aspettano di poterlo invocare Forza le sottoclassi (concrete) ad implementare il metodo abstract La classe astratta non può essere istanziata Le sottoclassi ereditano implementazioni e attributi Es. public abstract class Libro { public abstract void insert(); public String getautore() { E. Tramontana - Marzo 2018 5 E. Tramontana - Marzo 2018 6 Interfacce Classi e Interfacce In Java una interfaccia riprende il concetto di interfaccia di sistemi orientati ad oggetti Non fornisce una implementazione per i metodi Permette di definire un tipo Elenca le signature dei metodi public (senza corpo dei metodi) Posso solo dichiarare i metodi Niente attributi non inizializzati, niente costruttori public interface IAccount { public boolean deposito(int amount); public void setinitial(); public void setbalance(); public boolean check(); E. Tramontana - Marzo 2018 7 Una classe può implementare una interfaccia Ovvero, la classe fornisce un implementazione dei metodi def. dall interfaccia Non è possibile istanziare interfacce Tramite l interfaccia i client sanno cosa possono invocare Posso usare (per istanziazioni di oggetto e invocazioni di metodo) una qualsiasi delle implementazioni disponibili per l interfaccia Un client che usa una interfaccia rimane immutato quando l implementazione dell interfaccia cambia interface IAccount Client public class Account implements IAccount { public class AccountV2 implements IAccount { IAccount a = new AccountV2(); a.setbalance(); AccountV2 Account E. Tramontana - Marzo 2018 8

Compatibilità tra classi L ereditarietà permette una classificazione di tipi Una sottoclasse è un sottotipo compatibile con la superclasse, ovvero Una sottoclasse è anche ciò che è la superclasse Es. con Studente sottoclasse di Persona Il tipo Studente è compatibile con il tipo Persona La classe Studente fa tutto ciò che fa Persona La classe Studente fa altre cose oltre quelle che fa Persona Una sottoclasse può prendere il posto della superclasse Es. posso usare un istanza di Studente al posto di una di Persona Dove compare ad es. p.setnome() con p di tipo Persona posso sostituire s.setnome() con s di tipo Studente Attenzione: non vale il contrario, non posso usare la superclasse dove usavo la sottoclasse E. Tramontana - Marzo 2018 9 public class Persona { public void setnome(string nom, String cog) {... public void printall() {... public class Studente extends Persona { public void nuovoesame(string e, int v) {... public float getmedia() {... public void printall() {... MainEsami public class MainEsami { Studente s = new Studente(); // s è di tipo Studente s.setnome("mario", "Tanaka"); // metodo della superclasse di s s.nuovoesame("italiano", 6); // metodo della classe di s s.nuovoesame("fisica", 8); s.printall(); // metodo della classe di s Persona p = s; p.printall(); // p è dichiarato di tipo Persona // a runtime p punta all'istanza s Persona +setnome() +printall() Studente +nuovoesame() +getmedia() +printall() E. Tramontana - Marzo 2018 10 Considerazioni sul codice Il seguente diagramma UML di sequenza mostra le interazioni fra oggetti, per il codice precedente fornito La classe Studente Eredita tutto ciò che fornisce Persona Ridefinisce il metodo printall() (ovvero fa override), quindi modifica il comportamento del metodo printall() ereditato super.printall() per invocare printall() di Persona da Studente super permette di accedere ai metodi della superclasse JVM main() MainEsami create s:studente Per la classe Test La variabile p è di tipo Persona, ma punta a un istanza di Studente setname() o Posso invocare su p il metodo printall() Quale sarà il risultato? Viene invocato printall() di Studente nuovoesame() Non posso invocare su p il metodo nuovoesame() Il tipo di p a compile time (Persona) non ha il metodo nuovoesame() Quindi, il compilatore non può far invocare nuovoesame() su p (nonostante p punterà a runtime ad un istanza di Studente) E. Tramontana - Marzo 2018 11 printall() E. Tramontana - Marzo 2018 12

Late binding e polimorfismo Polimorfismo public class MainEsami { Persona p = new Persona(); Studente s = new Studente(); Persona px;... if (... ) px = p; else px = s; px.printall(); printall() invocato su px può assumere il comportamento definito in Persona o quello definito in Studente Il compilatore riconosce che printall() è definito per px (qualunque sia l istanza puntata) A runtime si decide quale printall() eseguire, ovvero si ha late binding Il comportamento di printall() è polimorfo E. Tramontana - Marzo 2018 13 Nei sistemi ad oggetti possono esistere metodi con lo stesso nome e la stessa signature (in classi diverse) Quando si usa l ereditarietà e sono stati definiti metodi con lo stesso nome, la chiamata ad un metodo può avere effetti diversi, ovvero si ha un comportamento polimorfo Es. ciascun elemento di s può indicare una qualsiasi istanza la cui classe ha come superclasse Shape public class TestShape { Shape[] s = new Shape[3]; s[0] = new Box(2,3); s[1] = new Circle(4); s[2] = new TriangRect(3, 4); for (int i=0; i<3; i++) s[i].show(); E. Tramontana - Marzo 2018 14 Polimorfismo Il polimorfismo è una caratteristica fondamentale dei sistemi ad oggetti Il late binding è tipico dei sistemi in cui esiste il polimorfismo Senza polimorfismo Dovremmo inserire uno switch sul chiamante per valutare la classe di ciascuna istanza e chiamare il metodo corrispondente a tale classe Sottoclassi e Dispatch public class Account { private float balance; public void setbalance(float amount) { if (check(amount)) balance = amount; public boolean check(float amount) { return (balance+amount) >= 0; public class SavingAccount extends Account { public boolean check(float amount) { return (balance+amount) >= 1000; E. Tramontana - Marzo 2018 15 Account acc = new SavingAccount(); acc.setbalance(1234); E. Tramontana - Marzo 2018 16

Dispatch Quale versione di check() è chiamata da setbalance()? Quando un metodo (setbalance()) è chiamato su un oggetto, viene controllato il suo tipo (a runtime): SavingAccount Si cerca il metodo setbalance() sul tipo a runtime: non trovato Se non trovato, si cerca la superclasse: Account Se trovato si esegue: Account.setBalance() Questo chiama check(), si cerca come prima Quindi si cerca prima su SavingAccount: trovato Si esegue SavingAccount.check() E. Tramontana - Marzo 2018 17 Tipi dichiarati e runtime A compile time, dichiaro un oggetto di un certo tipo Il tipo determina su quale specifica (signature) chi lo usa può contare, può essere una classe o un interfaccia. Un oggetto può essere di più tipi differenti (a compiletime) A runtime Un oggetto ha una sola implementazione che è sempre una classe, non un interfaccia Il tipo a runtime di un oggetto non cambia mai Casting Una variabile di un tipo può tenere un istanza del sottotipo (la classe Circle implementa l interfaccia Shape), o1 dichiarato Shape è compatibile con Circle Shape o1 = new Circle(); Circle c = (Circle) o1; Tramite cast forzo l istanza o1 del tipo Shape sulla variabile c del sottotipo Circle OK per il compilatore, OK a runtime solo se l'istanza o1 (a runtime) è del tipo di c Shape o2 = new Box(); Circle c = (Circle) o2; Se forzo o2 su c avrei a runtime un ClassCastException E. Tramontana - Marzo 2018 18