1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Ereditarietà.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Funzioni Friend Come abbiamo visto non possiamo accedere a membri privati di una classe dall'esterno della classe. Ma a volte abbiamo bisogno di farlo.
Costruttori e Distruttori
Informatica Recupero debito quarto anno Terzo incontro.
Programmazione object oriented in C++
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Derivazione tra classi
Corso di Informatica Applicata Lezione 6
Gerarchia di classi Java
Approfondimento delle classi
Unità Didattica 1 Algoritmi
Lab. Calc. 2005/06 Ereditarietà. Lab. Calc. 2005/06 Scopo di questa lezione: Imparare a creare nuove classi ereditando da classi già esistenti. Capire.
1 laboratorio di calcolo II AA 2003/04 quinta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Lezione XI Laboratorio di Programmazione. Ereditarieta Fondamentale proprieta dei linguaggi OO. Permette di specificare un nuova classe derivata da unaltra.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Programmazione in Java (8)
Ereditarietà e Polimorfismo
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Unità Didattica 3 Linguaggio C
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Complessità di un algoritmo
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Approfondimenti sulle Classi.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Polimorfismo.
Le variabili in Java Nella programmazione tradizionale, una variabile è una porzione di memoria in cui è immagazzinato un certo tipo di dato. Per esempio.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2014/15 Lezioni 1-2.
Programmazione a oggetti
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
CORSO DI PROGRAMMAZIONE II Lezione 22
GLI ARRAY MONODIMENSIONALI. Utilizzando le nostre attuali conoscenze, proviamo a risolvere il seguente problema: Calcolare la media dei voti conseguiti.
Programmazione ad oggetti
Oggetti in C# Lezione 2 Metodi e Static Oggetti in C# - Lezione 2.
Oggetti in C# Lezione 5 Polimorfismo I Andrea Zoccheddu.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Puntatori e Stringhe.
1. 2 Variabili statiche e dinamiche Un programma è un processo in esecuzione a cui il sistema operativo assegna una certa zona di memoria. Tale zona può.
Programmazione ad oggetti
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
1 Osservazioni Generali Struttura di programma Gerarchia di classi: overloading, overriding, e dispatching Analisi ed esecuzione Modificabilità e condivisione.
1 LABORATORIO DI INFORMATICA Ingegneria Informatica Dott. Giorgio Cicerchia a.a ° Ciclo.
Fondamenti di Informatica II Ingegneria Informatica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Alberi.
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)
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.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Strutture e Classi.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
“ Pseudocodice ” Un programma per computer lavorerà su in insieme di “ variabili ” contenenti i dati del problema, soluzioni intermedie, soluzioni finali.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Ereditarietà

2 Classe Base Classe Derivata Ereditarietà singola: La classe derivata eredita dati e funzioni membro della classe base, sovrascrivendo e migliorando le caratteristiche di quest’ultime e aggiungendo altri dai e funzioni. La classe derivata è più specifica della classe base e rappresenta perciò una classe di oggetti meno estesa (ad esempio la classe dei quadrati può considerarsi derivata dalla classe dei quadrilateri, ma è meno estesa della classe dei quadrilateri)

3 Ereditarietà Classe Base AClasse Base CClasse Base B Classe Derivata Ereditarietà Multipla: La classe derivata eredita dati e funzioni da più di una classe base. …………….

4 Ereditarietà Tipi di ereditarietà: L’ereditarietà può essere di tipo public, private, o protected. Per ora si studierà il caso dell’ereditarietà di tipo public in cui è possibile trattare allo stesso modo un oggetto della classe derivata e uno della classe base. Dichiarazione di ereditarietà public: Per dichiarare che una classe è derivata di tipo public da una classe base essa deve essere dichiarata nel seguente modo: class Nome_Classe_Derivata : public Nome_Classe_Base {.. …………..};

5 Ereditarietà Esempio: class Punto { public: Punto (x=0, y=0); void printPunto ( ); private: float x, y;}; ……………... ……………… class Segmento: public Punto { Segmento (float x=0., float y=0., float x1=0., float y2=0.); ………….. };

6 Ereditarietà Accedibilità dei membri Il tipo di ereditarietà comporta differenti gradi di accedibilità ai membri della classe base. Questi ultimi possono essere dichiarati, oltre che public e private, come abbiamo visto finora, anche protected, che, come vedremo rappresenta un grado intermedio di accedibilità. Nel caso di ereditarietà public si hanno le seguenti regole di accedibilità ai membri della classe base: Membri public: dalle funzioni membro della classe, dalle funzioni friend e da tutte le funzioni del programma (incluse quelle della classe derivata). Membri protected: dalle funzioni membro della classe, dalle funzioni friend e da quelle della classe derivata. Membri private: dalle funzioni membro della classe e dalle funzioni friend.

7 Ereditarietà Costruttore di una classe derivata Il costruttore di una classe derivata, poiché essa eredita tutti i dati membro della classe base, può, per inizializzarli, richiamare il costruttore della classe base. Le modalità sono quelle del costrutto d’inizializzazione, già viste per l’inizializzazione dei dati costanti e degli oggetti membro. L’implementazione del costruttore assume quindi l’aspetto: Nome_Classe_Derivata :: Nome_Classe_Derivata (Argomenti_di_Inizializzazione_Classe_Base _e_Derivata) :Nome_Classe_Base (Parametri_Inizializzazione_Classe_Base) {…..Inizializzazione dati membro della classe derivata….} Nota: Se manca il richiamo al costruttore della classe base viene richiamata l’inizializzazione di default della classe base che deve esistere.

8 Ereditarietà Esempio: class Punto {//Classe base public:Punto (float =0., float=0.); void printPunto ( ); private: float x, y;}; ………………//Costruttore classe base: Punto :: Punto (float s, float t) { x= s; y= t;} …………….. class Segmento: public Punto {//Classe derivata public:Segmento (float x=0., float y=0., float x1=0., float y1=0.); private: float x1, y1; ………….. }; ……………... //Costruttore classe derivata: Segmento :: Segmento (float a, float b, float c, float d) :Punto (a, b) {……………………………...}

9 Ereditarietà Array di oggetti diversi E’ possibile costruire un array che contiene oggetti diversi se lo si dichiara del tipo della classe base da cui derivano le classi degli oggetti diversi. Casting Per mezzo dell’operatore di casting è possibile creare la versione temporanea di classe base di un oggetto di una classe derivata: i valori dei dati membro dell’oggetto di classe base saranno quelli al momento assunti dall’oggetto della classe derivata. L’operazione suddetta è la seguente: …… static_cast (Oggetto_Classe_Derivata)

10 Ereditarietà Puntatori a classi base e derivate Nell’ereditarietà di tipo public è sempre possibile assegnare un puntatore ad una classe derivata ad un puntatore ad una classe base con una operazione diretta: Puntatore_Classe_Base= & Nome_Oggetto_Classe_Derivata; Il puntatore alla classe base così inizializzato permette soltanto l’accesso ai membri relativi alla classe base dell’oggetto della classe derivata.

11 Ereditarietà Puntatori a classi base e derivate L’operazione inversa, ossia l’assegnazione di un puntatore alla classe derivata ad un puntatore alla classe base, può essere effettuata solo con una operazione di casting nel modo seguente: Puntatore_Classe_Derivata= static_cast (Puntatore_Classe_Base); Questa operazione da sola non permette però di trasferire al puntatore alla classe derivata la possibilità di accedere ai membri della classe derivata. Per ottenere ciò, prima del casting, il puntatore alla classe base deve essere stato già inizializzato con un puntatore alla classe derivata con una assegnazione come quella mostrata nella pagina precedente.

12 Ereditarietà class Punto {//Classe base public:Punto (float =0., float=0.); void printPunto ( ); private: float x, y;}; …………….. class Segmento: public Punto {//Classe derivata public:Segmento (float x=0., float y=0., float x1=0., float y1=0.); private: float x1, y1;………….. }; ……………… Segmento r(0.2, 0.5, 3.1, 3.5), *segPtr; Punto *punPtr; segPtr= &r; //segPtr accede i membri della classe derivata, //ma anche della classe base punPtr= &r;//punPtr accede solo i membri della classe base segPtr= static_cast (punPtr); //segPtr può accedere i membri sia della classe //base che della derivata

13 Ereditarietà Overriding di una funzione di una classe base in una classe derivata L’overriding (sovrascrittura) si può fare assegnando alla funzione di overriding nella classe derivata lo stesso nome e la stessa segnatura della funzione della classe base. La funzione di overriding della classe derivata deve comunque essere invocata ricorrendo ad un oggetto della classe derivata. La funzione sovrascritta può comunque ancora essere invocata dall’interno della classe derivata e, quindi, anche dalla funzione di overriding, ricorrendo all’operatore di risoluzione dello scope: Nome_Classe_Base :: Nome_Funzione_Sovrascritta (..Parametri…);

14 Ereditarietà Sequenza di esecuzione di costruttori e distruttori Dichiarando l’esistenza di un oggetto di una classe derivata contenente oggetti di altre classi e con una classe base contenente anch’essa oggetti di altre classi, l’ordine di esecuzione dei costruttori sarà il seguente: 1 - Costruttori degli oggetti contenuti nella classe base 2 - Costruttore della classe base 3 - Costruttori degli oggetti contenuti nella classe derivata 4 - Costruttore della classe derivata Al momento dell’uscita dallo scope dell’oggetto così creato, i distruttori vengono eseguiti nell’ordine inverso a quello sopra riportato.

15 Ereditarietà Relazioni tra oggetti e funzioni Le relazioni tra oggetti e funzioni finora incontrate possono essere inquadrate nella seguente casistica: Relazione is a has a uses a knows a Descrizione Ereditarietà di tipo public (es.: un oggetto della classe derivata “is a” un oggetto della classe base) Una classe contiene altre classi come membri (es.: la classe A “has a” un membro che è oggetto della classe B Uso da una classe di una funzione membro di un’altra classe (es.: la classe A “uses a” funzione della classe B) Un oggetto contiene un handle (puntatore o riferimento) di un altro oggetto.

16 Ereditarietà Ereditarietà multipla La dichiarazione dell’ereditarietà pubblica multipla è la seguente: class Nome_Classe_Derivata :public Nome_Prima_Classe_Base, Nome_Seconda_Classe_Base, ……..{ ………….. }; Il costruttore di una classe derivata pubblica con ereditarietà multipla assume quindi l’aspetto: Nome_Classe_Derivata :: Nome_Classe_Derivata (Argomenti_di_Inizializzazione_Classi_Base _e_Derivata) :Nome_Prima_Classe_Base (Parametri_Prima_Classe_Base), Nome_Seconda_Classe_Base (Parametri_Seconda_Classe_Base) ……………………………………………………………………… {…..Inizializzazione dati membro della classe derivata….}

17 Ereditarietà Ereditarietà multipla Nota: Possono sorgere problemi di ambiguità se le classi base hanno funzioni membro con lo stesso nome: in questo caso i problemi possono essere evitati invocando le funzioni con i nomi delle classi e l’operatore binario di risoluzione dello scope: Nome_Classe_Base :: Nome_Funzione (..Parametri…);