Programmazione a Oggetti Lezione 10. Ereditarieta



Похожие документы
Modulo 4: Ereditarietà, interfacce e clonazione

Parola chiave extends

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

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

Esercizi della lezione 5 di Java

Oggetti Lezione 3. aspetti generali e definizione di classi I

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Corso di Informatica

Esercitazione n 4. Obiettivi

Programmazione Java: Variabili membro, Metodi La parola chiave final

Corso di Programmazione ad Oggetti

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

Java: Compilatore e Interprete

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Object Oriented Programming

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Programmazione a Oggetti Modulo B

Progettazione : Design Pattern Creazionali

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

Esempio: il conto bancario

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

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

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

13. Chain of Responsibility


Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Relazioni tra oggetti e classi : Composizione. Relazioni tra oggetti e classi : esempio di Aggregazione. classe contenitore

Main System Monitor Keyboard

Concetto di Funzione e Procedura METODI in Java

Algoritmi di Ricerca. Esempi di programmi Java

GESTIONE DEI PROCESSI

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Introduzione a Classi e Oggetti

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Inizializzazione, Assegnamento e Distruzione di Classi

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

RMI Remote Method Invocation

Introduzione alla Programmazione ad Oggetti in C++

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

Multithreading in Java. Fondamenti di Sistemi Informativi

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

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

I file di dati. Unità didattica D1 1

Programmazione Orientata agli Oggetti in Linguaggio Java

Realizzazione di una classe con un associazione

DESIGN PATTERN CREAZIONALI INGEGNERIA DEL SOFTWARE INTRODUZIONE SINGLETON. Scopo dei design pattern creazionali

UML Diagrammi delle classi. UML Diagramma classi 1

Test di unità con JUnit4

Funzioni in C. Violetta Lonati

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Tricks & Tips. [Access] Tutorial - ActiveX - Controllo Tree View. - Michele de Nittis - Versione: 1 Data Versione: venerdì 30 agosto 2002

Allocazione dinamica della memoria - riepilogo

Java threads (2) Programmazione Concorrente

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Java Virtual Machine

Alcuni Design Pattern in Java

Telematica II 17. Esercitazione/Laboratorio 6

Programmazione ad oggetti

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Visibilità dei Membri di una Classe

Definizione di classi con array di oggetti

Programmazione ad Oggetti: JAVA. Esercitazione

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1

Ereditarietà e classi astratte

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame("Finestra"); // crea frame invisibile

INTRODUZIONE INTRODUZIONE JAVA JAVA

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Le variabili. Olga Scotti

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Programmare in Java. Olga Scotti

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

1. I FONDAMENTI DELLA PROGRAMMAZIONE AD OGGETTI

Controllo degli accessi

Java: Compilazione e Traduzione. Fondamenti di Informatica L-B Esercitazione n 3 Introduzione a JAVA. C: Editing, compilazione, esecuzione

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

costruttori e distruttori

La struttura dati ad albero binario

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Programmazione in Java Parte I: Fondamenti

dall argomento argomento della malloc()

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Eclipse. Avviare un progetto e compilare un semplice programma

Java. Programmazione orientata agli oggetti

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Livelli di astrazione

Informatica. Prof. A. Longheu. Introduzione ai Linguaggi Object-Oriented

Architettura MVC-2: i JavaBeans

Appunti di Informatica 1

Object Oriented Software Design

JNDI. Massimo Merro Programmazione di Rete 214 / 229

Транскрипт:

Programmazione a Oggetti Lezione 10 Ereditarieta

Sommario Come definire sottoclassi Costruttori Abstract Classes Final

Ereditarietà: promemoria Strumento tipico dell OOP per riusare il codice e creare una gerarchia di astrazioni 1. Generalizzazione: Una superclasse generalizza una sottoclasse fornendo un comportamento condiviso dalle sottoclassi 2. Specializzazione: Una sottoclasse specializza (concretizza) il comportamento di una superclasse Permette di rappresentare relazioni di tipo IS- A (o IS-KIND-OF) oppure IS-LIKE (specializzazione procedurale)

Ereditarietà: a cosa serve? In un certo senso, a niente! Replicando opportunamente il codice (attenzione al method lookup!) Localizza la scrittura di alcune procedure rendendole comune a tutte le classi; Permette di specializzare il comportamento di una classe, prevedendo nuove funzionalità, mantendendo le vecchie e quindi senza influenzare codice cliente già scritto.

Ereditarietà in Java Una sottoclasse si definisce usando la parola chiave extends: class Impiegato extends Persona {...} Osservate che l ereditarietà in Java è semplice. Una classe può implementare più interfacce, ma estendere solo una superclasse. Perché?

Ereditarietà in Java class Persona { private String nome; private int eta; Persona(String s, int e) {nome=s; eta=e;} public int eta() {return eta;} } class Impiegato extends Persona{ private static int salario; private int ufficio; Impiegato(??){??} public static void aumento(int a) {salario = salario + a;}

Ereditarietà in Java La classe Impiegato eredita implicitamente i campi definiti dalla classe Persona. Osservate che nella classe Impiegato non sono visibili le variabili e metodi dichiarati private. Quindi fanno parte dello stato degli oggetti istanziati, ma non sono riferibili (direttamente) dai nuovi metodi. Importante: Il tipo Impiegato è sottotipo del tipo Persona.

E il costruttore? Tipicamente deve accedere alle variabili di istanza, anche della superclasse. Soluzioni: definire i metodi di accesso (getters e setters) definire le variabili di istanza sempre protected Insoddisfacenti: rilassano l incapsulazione (l implementatore della sottoclasse potrebbe non rispettare proprietà desiderate nella superclasse) non favoriscono il riuso del codice Si deve poter riferire il costruttore della superclasse

Costruttore class Impiegato extends Persona {private static int salario; private int ufficio; Impiegato( public static void aumento(int a) {salario = salario + a;} Impiegato(String n, int e, int u) { super(n,e); ufficio = u; } }

Costruttore super Attenzione! Se non c è nella sottoclasse una chiamata esplicita al costruttore della superclasse, il complilatore aggiunge automaticamente il codice: super() che invoca il default constructor o un costruttore senza parametri. Se non fosse presente, genererebbe un errore in compilazione. Ordine di esecuzione dei costruttori: prima i costruttori delle superclassi, poi eventuali inizializzatori, infine il costruttore.

Esercizio Scrivere una gerarchia di 3 classi, Nonno, Padre e Nipote che in output evidenzi l ordine di esecuzione dei costruttori. (max 20 righe di codice ) Il programma principale, sarà semplicemente: public class testorderconstruction { Nipote n = new Nipote(); public void static main(string arg[]){} }

Metodi La sottoclasse eredita i metodi dalla superclasse. La sottoclasse può ridefinire (override) un metodo (stesso tipo e livello di visibilità maggiore). Il dynamic dispatch garantirà che venga eseguita la versione più specifica del metodo (sulla base del tipo dinamico del ricevente). Attenzione: non confondere overriding e overloading

Dynamic Method Lookup Attenzione: Il lookup dei metodi non è sempre dinamico. Esistono due significative eccezioni: - chiamate di metodi privati (in fondo non sono accessibili alle sottoclassi, quindi non si può fare overriding). - chiamate attraverso super (Smalltalk docet!) E sempre statico anche il binding dei metodi di classe (beh, si chiamano static) e delle variabili (sia di istanza che di classe)

Esercizio Scrivere una gerarchia di 2 classi, Padre e Figlio che in output evidenzi le regole di lookup dei metodi sopra viste (max 15 righe di codice ) Il programma principale, sarà semplicemente: public class testmethodlookup { Figlio f = new Figlio(); public void static main() {f.m();} }

Template Methods Buona abitudine: scomporre il comportamento di un metodo in sottotask (write stupid methods) public void dosomething() { dothis(); dothat(); } Logica: ritardare finchè possibile l implementazione. Vantaggio: si guadagna flessibilità. Magari per specializzare il metodo in una sottoclasse è sufficiente fare overriding di dothis(). Problema: dothis() e dothat() non sono logicamente parte dell interfaccia. Soluzione: dichiararli protected!

Final Un metodo dichiarato final non può venire ridefinito in una sottoclasse (ha senso per i public e protected) La parola chiave final può essere usata anche per campi e classi: private final int pi = 3.14 Costanti final class NoSub{ } non si può estendere Motivazioni:sicurezza public boolean validatepassword(string s) Attenzione: se il metodo final contiene chiamate a metodi non final il suo comportamento può essere modificato dalle sottoclassi; Ottimizzazione: i metodi final sono chiamati seguendo static binding.

Metodi e Classi Astratte Un metodo dichiarato abstract può non venire implementato. Una classe che contiene un metodo astratto deve essere dichiarata anch essa abstract. Da una classe astratta non si possono generare istanze. Una sottoclasse può diventare concreta se implementa TUTTI i metodi pubblici abstract della superclasse astratta. Altrimenti è anch essa una classe astratta. Classi astratte vs Interfacce: riflettete

Classe Object Tutte le classi ereditano implicitamente dalla root class Object. Fornisce un insieme di metodi ereditati da TUTTE le classi. Ad esempio il metodo tostring(). I metodi definiti da Object possono essere ovviamente ridefiniti. Esperimento: cercate sul JAVA SUN TUTORIAL i servizi offerti dalla classe Object.

Esempio: cella di memoria Scriviamo una classe che implementa una cella di memoria: class Cell{ { private int val; public Cell(int v) {val=v;} public int getval() {return val;} public void setval(int v){val=v;} public void clear(){setval(0);} }

Esempio: cella con backup Ogni volta che modifichiamo il valore memorizzato, salviamo il vecchio valore. Definiamo una funzione restore() che permette di ripristinare il valore precedente: class BackupCell extends Cell{ { private int backup; public BackupCell(int v) {super(v); backup=0;} public void setval(int v) {backup=getval(); super.setval();} public int restore() {super.setval(backup); return backup;} }

Esempio: setval() Chiama il metodo ereditato public void setval(int v) {backup=getval(); super.setval();} Invoca il metodo della superclasse. E overridden, ma visibile. Non ci sono altri modi di settare val

dimenticassimo super? E se invece public void setval(int v) {backup=getval(); setval();} Che succede? Cell c = new Cell(0); c.setval(1); c = new BackupCell(1); c.setval(4);

restore() e se dimenticassimo super? public void setval(int v) {super.setval(backup); return backup;} Qui potremmo scrivere semplicemente setval(backup); Cosa cambierebbe?