Ereditarietà: concetti di base

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

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

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

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

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

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Ereditarietà e Polimorfismo

Informatica Ereditarietà Java. Ereditarietà

ereditarietà e polimorfismo

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

PRINCIPI DELLA OOP. Ereditarietà e polimorfismo

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione con Java

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Ereditarietà (ultima)

Ereditarietà (ultima)

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

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

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

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

16 - Ereditarietà, tipi e gerarchie

16 - Ereditarietà, tipi e gerarchie

17 - Ereditarietà, tipi e gerarchie

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

La classe java.lang.object

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

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

Esempi in Java di program.ne O-O

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

Gerarchia di classi Java 1

OOP Ereditarietà A. FERRARI

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

Dichiarazione di una classe. Dichiarazione ereditarietà

I costruttori. Il costruttore standard. Esempio di valori di default. Alterare il costruttore standard

RIUSABILITÀ L OBIETTIVO

Programmazione I - Preparazione A.A. 2010/2011

Progettazione Object-Oriented

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

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

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

INFORMATICA OOP Relazioni tra classi Roberta Gerboni

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

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

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Esempio 2: Subtyping

Inizializzare oggetti

Programmazione orientata agli oggetti Ereditarietà

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

Corso di Progettazione del Software

Ingegneria del Software

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

Programmazione a oggetti

Modello procedurale versus modello O-O

Programmazione a Oggetti. Ereditarieta

Classi astratte Interfacce

Programmazione orientata agli oggetti Classi astratte e interfacce

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

Java. Ereditarieta RIUSO DEL CODICE

Gerarchia di classi Java 1

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

Ereditarietà e polimorfismo

Programmazione ad oggetti

Programmazione I. 11 gennaio Considerate la seguente gerarchia di classi (rappresentata mediante un diagramma UML): +f(double x):

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

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

Fondamenti di Informatica

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

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

14 - Metodi e Costruttori

E18 Esercizi su ereditarietà e polimorfismo

Fondamenti di Informatica T-1. Ereditarietà & Polimorfismo

Uguaglianza e copia di oggetti

Programmazione I - corso B a.a prof. Viviana Bono

In questa lezione. Polimorfismo

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

RETI DI CALCOLATORI Linguaggio Java: Ereditarietà

A. Ferrari Object Oriented Design

Riassunto. La programmazione OO. Oggi. Esempio

Java: Definire Classi e Creare Oggetti

E7 Esercizi sul Capitolo 7 Realizzazione di Classi

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

PROGRAMMAZIONE 2 4. Java: un modello operazionale

Eccezioni predefinite

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

Programmazione Orientata agli Oggetti in Linguaggio Java

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

Esercitazione n 2. Obiettivi

Transcript:

: concetti di base L ereditarietà è uno dei concetti base della programmazione ad oggetti Concetto di base: l ereditarietà permette di usare una classe precedentemente definita per la definizione di una nuova L ereditarietà è una tecnica tale per cui è possibile definire: una classe estremamente generale successivamente classi più specializzate semplicemente aggiungendo nuovi dettagli alla classe di partenza 2 1

: definizione più formale È una relazione fra classi in cui una classe (superclasse o classe base) raccoglie a fattor comune le caratteristiche comuni di una o più altre classi (sottoclassi o specializzazioni) Le sottoclassi ereditano tutte le caratteristiche della superclasse In UML si indica graficamente con una freccia dalla sottoclasse alla superclasse superclasse o classe base VeicoloMotorizzato sottoclassi o specializzazioni Auto Moto Pulman 3 Astrazione Superclassi Generalizzazione Specializzazione Classi Classificazione Istanziazione Oggetti Rappresentazione 4 Mondo reale 2

Perché l Economia tutti gli attributi, operazioni e associazioni comuni a un certo insieme di classi vengono scritte una sola volta Consistenza se un attributo, operazione o associazione della superclasse viene cambiato, la modifica si ripercuote automaticamente su tutte le sottoclassi Riuso la superclasse può essere riusata in contesti diversi Estendibilità è sempre possibile, anche in un secondo momento, aggiungere nuove sottoclassi senza dover riscrivere la parte comune contenuta nella superclasse ogni sottoclasse può ridefinire a piacimento attributi e operazioni (overriding) 5 Fino a dove posso arrivare? Non ho limiti sulla gerarchia che posso costruire Veicolo VeicoloMotorizzato VeicoloNonMotorizzato Auto Moto Pulman Bicicletta Carrozza Taxi 6 3

Il tipo di relazione L ereditarietà realizza una relazione is-a Quindi è corretto affermare che un oggetto creato a partire da una sottoclasse sia di tipo della superclasse! Esempi: un oggetto istanziato a partire dalla classe Bicicletta, oltre che essere una Bicicletta, è anche un VeicoloNonMotorizzato e un Veicolo un oggetto istanziato a partire dalla classe Taxi, oltre che ad essere un Taxi, è anche un Automobile, un VeicoloMotorizzato e un Veicolo... 7 multipla Una classe può ereditare da più superclassi (ereditarietà multipla) Esempio: lo studente lavoratore... Studente - nome: String - cognome: String - matricola: int Lavoratore - nome: String - cognome: String - numeroprevidenza: int StudenteLav oratore 8 4

multipla: problemi L ereditarietà multipla è semplice concettualmente, ma porta a una serie di problemi tecnici: Cosa succede se una classe eredita due volte dalla stessa superclasse? Cosa succede se due superclassi diverse hanno un attributo con lo stesso nome? Fortunatamente Java non supporta l ereditarietà multipla Studente - matricola: int Persona - nome: String - cognome: String StudenteLav oratore Lav oratore - numeroprevidenza: int 9 L in Java La sintassi utilizzata in Java per esplicitare che una classe deriva da un altra è la seguente: public class ClassePadre {... public class ClasseFiglia extends ClassePadre {... 10 5

Esempio Proviamo ad implementare il seguente diagramma di classi nessun costruttore e metodo tostring() Persona - nome: String - cognome: String Creiamo un altra classe con main in cui: creiamo una persona con nome Mario, cognome Rossi creiamo uno studente con nome Marco, cognome Verdi e matricola 123456 stampiamo lo stato degli oggetti + setnome(nome :String) : void + setcognome(cognome :String) : void + getnome() : String + getcognome() : String Studente - matricola: int + setmatricola(matricola :int) : void + getmatricola() : int Sorgente... 11 La classe Object In Java qualsiasi classe specializza la classe Object Fino ad ora, non sapendolo, abbiamo scritto classi che sono specializzazione della classe Object quindi qualsiasi metodo ed attributo definito nella classe Object è ereditato dalle sottoclassi Alcuni metodi importanti della classe Object: public boolean equals(object o) public String tostring() Object + equals(object :Object) : boolean + tostring() : String Persona - nome: String - cognome: String + setnome(nome :String) : void + setcognome(cognome :String) : void + getnome() : String + getcognome() : String Studente - matricola: int + setmatricola(matricola :int) : void + getmatricola() : int 12 6

Esempio Se modifichiamo il main dell esercizio della slide 12 nel modo seguente: public class Test { public static void main(string a[]) { Persona p = new Persona(); p.setnome("mario"); p.setcognome("rossi");... Non avremo errori di compilazione: su oggetti di tipo Persona è possibile invocare il metodo tostring() poiché ereditato dalla classe Object Output del tipo: NomeClasse@hashCode Studente s = new Studente(); s.setnome("marco"); s.setcognome("verdi"); s.setmatricola(123456); System.out.println("Persona "+ p.getnome() + " " + p.getcognome()); System.out.println("Studente "+ s.getnome() + " " + s.getcognome() + " " + s.getmatricola()); System.out.println(p.toString()); 13 Visibilità Quando una classe ne specializza un altra, eredita tutto a prescidere dalla visibità! Però: se un attributo è definito private nella superclasse non sarà accessibile tramite nome! occorrerà passare attraverso metodi (ovviamente non privati!) se un metodo è definito private nella superclasse, non ci sarà alcun modo per permettere alle sottoclassi di invocarlo Se le sottoclassi hanno la necessità di accedere in modo diretto ad attributi e/o metodi definiti nella superclasse devo utilizzare un altro tipo di visibilità: protected Esempio: Auto + Taxi 14 7

Esempio package a Accede direttamente a: x, y, w, z Accede direttamente a: y, w, z A - x: int # y: int ~ z: int + w: int Accede direttamente a: y, w B C Su istanze di tipo B, accede direttamente a: y, w, z 1 1 Su istanze di tipo C, accede direttamente a: w Esempio: D E Esempio: B b;... b.y; b.w; b.z; package b C c;... c.w; 15 Riepilogo sulle visibilità Il modificatore di visibilità si applica ad attributi e metodi con lo stesso significato: Visibilità public protected private Chi può accedere la classe in cui è definito tutte le classi (sottoclassi, le classi in associazione, classi nello stesso package, classi in package diversi) la classe in cui è definito le sottoclassi le classi appartenenti allo stesso package la classe in cui è definito le classi appartenenti allo stesso package 16 8

Costruttori Cosa succede per i costruttori che accettano in ingresso parametri? Regola da rispettare: ogni classe inizializza i propri attributi! ritornando all esempio della Persona e della classe Studente il/i costruttori della classe Persona inizializzeranno gli attributi nome e cognome il/i costruttori della classe Studente inizializzeranno l attributo matricola ma uno studente è caratterizzato anche dal possedere un nome e un cognome dal momento che è una specializzazione della classe Persona quindi, quando si crea uno studente, occorre inizializzare anche nome e cognome Come si fa? 17 Costruttori Esistono 2 modi: Meno elegante: nel/nei costruttori della sottoclasse si inizializzno i valori per tutti gli attributi Più elegante: si invoca il costruttore della superclasse passando come argomenti i valori per gli attributi li definiti per fare ciò si utilizza la keyword super L invocazione al costruttore della superclasse deve essere la prima istruzione ad essere eseguita quindi non ci possono essere contemporaneamente super e this 18 9

Regole Sono sempre obbligato ad invocare esplicitamente il costruttore della superclasse? No: se la superclasse esporta il costruttore di default Si: se la superclasse esporta esclusivamente costruttori con parametri Anche se io non invoco esplicitamente il costruttore della superclasse, Java inserisce all interno dei costruttori definiti nella sottoclasse l invocazione al costruttore di default della superclasse ciò comporta che il primo costruttore ad essere eseguito è sempre quello della classe Object ciò è valido se il costruttore non ha l invocazione this! 19 Implementazione relazione is-a Ricordandoci che l ereditarietà realizza una relazione is-a, è lecito scrivere: SuperClasse ref = new SottoClasse(); Ma non è lecito scrivere: SottoClasse ref = new SuperClasse(); 20 10

Esempi Ok Persona s1 = new Studente(); Studente s3 = new Persona(); Ok Object s2 = new Studente(); Ok Object p1 = new Persona(); Ok s1.setnome( Paperone ); s2.setcognome( De Paperoni ); Ok p1.tostring(); 21 Ancora un esempio Realizziamo il seguente diagramma di classi: Animale - String nome + Animale() + void dormi() + void mangia() Gatto + Gatto() + void failefusa() + void parla() Papera + Papera() + void parla() Cane + Cane() + void ringhia() + void parla() Creiamo una classe in cui definiamo un array di 3 animali ed inseriamo un gatto, un cane ed una papera Per ciascuno di essi invochiamo rispettivamente: dormi, parla e mangia 22 11

Il cast Permette di convertire un reference ad un tipo inferiore in gerarchia di parentela Sintassi: Esempio: Meglio se si effettua il controllo prima: 23 NomeClasseFiglia ref2 = (NomeClasseFiglia)ref1; Animale a = new Gatto( Miguel );... Gatto g = (Gatto)a; g.failefusa(); if (a instanceof Gatto) { Gatto g = (Gatto)a; g.failefusa(); Concetti avanzati: classi astratte Una classe può essere astratta questo significa che non corrisponde a un concetto concreto del dominio applicativo, ma che è fatta apposta per funzionare da superclasse esempio: non esiste un veicolo, esiste un auto, una moto,... Un classe astratta: non può essere instanziata ha senso solo in quanto ne vengono create delle sottoclassi Una classe deve essere dichiarata astratta se definisce almeno un metodo astratto Una classe può essere dichiarata astratta anche se non definisce metodi astratti 24 12

Sintassi Classe astratta public abstract class NomeClasse {... Metodo astratto: [mod. visibilità] abstract void nomemetodo([parametri]); 25 L abstract si propaga Sono costretta a definire astratte anche le sottoclassi che non definiscono il comportamento di metodi astratti ereditati Esempio: Animale - String nome + Animale() + void dormi() + void mangia() + void parla() Felino + Felino() Papera + Papera() Cane + Cane() + void ringhia() Leone + Leone() Gatto + Gatto() + void failefusa() 26 13

L ereditarietà multipla? Effettivamente in java la si realizza grazie all utilizzo delle interface L interface realizza quasi un associazione del tipo is-a al test instanceof restituisce true o false Le interface contengono solo intestazioni di metodi e al più definizioni di costanti Sintassi: public interface NomeInterface { // definizione nomi metodi 27 public class Classe implements NomeInterface { // definizione del corpo dei metodi ereditati Esempi di ereditarietà: Slide successiva: equals 28 14

Confrontare lo stato di 2 oggetti L operatore == applicato a 2 reference permette di testare se essi referenziano lo stesso oggetto Ma se volessi sapere se due oggetti si trovano nello stesso stato, come faccio? effettuo una comparazione fra i valori degli attributi Modalità classica: overridare il metodo equals della classe Object intestazione: public boolean equals(nomeclasse obj) 29 15