150 likes | 331 Views
Lezione 20. Programmazione a oggetti. Programmazione MIDI (Prof. Luca A. Ludovico). Introduzione. Obiettivi: Definire classi contenenti variabili, metodi e costruttori Istanziare oggetti di tali classi Usare l’operatore “.” per accedere a variabili e metodi delle classi
E N D
Lezione 20 Programmazione a oggetti Programmazione MIDI (Prof. Luca A. Ludovico)
Introduzione • Obiettivi: • Definire classi contenenti variabili, metodi e costruttori • Istanziare oggetti di tali classi • Usare l’operatore “.” per accedere a variabili e metodi delle classi • Apprendere l’uso dei modificatori d’accesso public e private • Creare gerarchie classi con ereditarietà • Apprendere l’uso dei modificatori protected, final e static • Utilizzare le enumerazioni (classi specializzate che permettono di definire e usare insiemi di costanti) Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Ereditarietà • Ereditarietà: permette di derivare nuove classi a partire da quelle già definite realizzando una gerarchia di classi. Una classe derivata (sottoclasse o classe figlia) mantiene i metodi e gli attributi delle classi da cui deriva (classi base, superclassi o classi padre); inoltre, può definire i propri metodi o attributi, e ridefinire il codice di alcuni dei metodi ereditati tramite un meccanismo chiamato overriding • Una sottoclasse è più specializzata rispetto alla sua superclasse; analogamente, una superclasse è più generica rispetto a una sottoclasse • JAVA (come C++) supporta solo l’ereditarietà singola: un figlio può avere un solo padre → la gerarchia tra classi forma un albero Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Esempio di ereditarietà • Si consideriilrapportogerarchicotra la superclasseAnimale e la sottoclasseFelino: • l’attributogeneresaràcomune a tuttiglianimali, il cui generesaràsempremaschile o femminile, al limiteindefinito; • Il metodocalcolaEta, checombinal’attributodata_nascita con la data corrente per restituireilnumero di annidell’esemplare, saràdefinitonellasuperclasse, e rimarràvalido per tutte le sottoclassicheereditano (l’etàsicalcolaallostessomodo per tuttigliesseriviventi) • un felinoavràperòdeidescrittoripiùspecificirispetto a un genericoanimale (sipensi al colore del pelo, attributoche non avrebbesenso per un genericoanimale, chepotrebbeesseresquamato, piumato, ecc.) Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Dichiarazione di sottoclassi class MiaClasse { … } La dichiarazione precedente è minimale, in quanto racchiude solo componenti strettamente richiesti. Si può ad esempio stabilire una relazione gerarchica tra classe padre e classe figlia tramite la sintassi: class MiaClasse extends MiaSuperClasse { … } Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
La gerarchia di classi in Java • Tutte le classi ereditano dalla superclasse Object: è la classe più generale di tutte, e definisce comportamenti comuni a tutte le classi. • Le classi inferiori nella gerarchia mettono a disposizione comportamenti più specifici e possono sovrascrivere e/o nascondere i metodi delle classi più generali Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
La gerarchia di classi in JAVA • La superclasseObjectcontienemetodigenerali, disponibili a tutte le classicheereditano (quindi a tutte le classi), tra cui: • Object clone() crea e restituisceunacopiadell’oggettocorrente • boolean equals(Object obj)indica se un altrooggetto è uguale a questo • String toString()restituisceunarappresentazione a stringa di testodell’oggetto • Esempio: invocareilmetodotoString()suunaclassedefinitadall’utenteche non ne contieneunapropriaversione • Esempio: ridefinireilmetodotoString()in unaclassedefinitadall’utente Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Assegnamento tra oggetti • L’operatore di assegnamentofunzionatraoggettidellastessaclasse • Poichèunasuperclasse è piùgenerica di unasottoclasse: • è semprepossibileassegnare un oggetto di unasottoclasse a un oggetto di unasuperclasse. • non è possibile (e genera errore a compile-time) assegnare un oggetto di unasuperclasse a un oggetto di unasottoclasse • Esempio MusicSymbol a = new MusicSymbol (); MusicSymbol b = new MusicSymbol (); a = b; // ok MusicNote n = new MusicNote(); // MusicNoteeredita da MusicSymbol a = n; // ok n = a; // no!!! Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Cast delle variabili • Tramiteil cast sipuòspecificare al compilatoreche un oggetto di classe A è dellaclasse B piùspecifica Object o = "str"; String str = (String)o; • Possibilierrori: effettuareil cast di oggetticheappartengono • a rami diversidellagerarchia String o = "str"; Integer i= (Integer)o; // Errore a compile-time • allostessoramo ma cmq non sono “castabili”, ilchesolleva a run-time un’eccezioneClassCastException Number o = new Integer(5); Double n = (Double)o; // SollevaClassCastException • Usotipico: passare da un tipopiùgenerale a unopiùspecifico. Ad esempio Integer eredita da Number (tuttigliinterisononumeri ma non viceversa: ad esempio Double, Float, Byte, Long) Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
I modificatori d’accesso protected e (default) • Protectedpuò essere attribuito solo ai metodi e alle variabili interne alla classe e non può essere applicato alla classe stessa • I metodi e le variabili dichiarate come protected sono visibili da classi dichiarate nello stesso package e da sottoclassi e classi derivate dichiarate ovunque • Se non viene specificato nulla, il compilatore considera un modificatore d’accesso detto di default. • Un membro di una classe (metodo o attributo) per default sarà accessibile solo dalle classi appartenenti al package dove è definito • Una classe appartenente ad un package definita senza il modificatore public sarà visibile solo dalle classi appartenenti allo stesso package Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Specchietto riassuntivo • I modificatori di accesso sono 3: private, protected e public • In assenza di questi tre, un elemento di programma viene considerato package-local o friend (si dice che assume la visibilità di default) • Le visibilità possibili sono: Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Polimorfismo e override • Una classe che eredita può richiedere la riscrittura e la specializzazione di metodi ereditati. Nella programmazione ad oggetti l’overrideè l'operazione di riscrittura di un metodo ereditato • Il metodocheeffettua override deveavere lo stessonome, stessonumero e tipo di parametri, e stessotiporestituitorispetto a quellooriginario • puòancherestituire un sottotipo del tiporestituito (covariant return type) • Polimorfismo(dal greco "avere molte forme"): un’interfaccia, molte implementazioni. I metodi che vengono ridefiniti in una sottoclasse sono detti polimorfi, in quanto lo stesso metodo si comporta diversamente a seconda del tipo di oggetto su cui è invocato Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Polimorfismo dei metodi: overload e override • Dal punto di vista implementativo il polimorfismo per i metodi si ottiene utilizzando l'overload e l'override dei metodi stessi. • Ogni metodo è identificato dal nome, ma è univocamente determinato anche dalla lista dei parametri. Ciò permette di avere all'interno di una classe più metodi che hanno lo stesso nome, ma con parametri diversi • L'overload si basa sulla scrittura di più metodi identificati dallo stesso nome che però hanno, in ingresso, parametri di tipo e in numero diverso • Con il termine override si intende una vera e propria riscrittura di un certo metodo di una classe che si eredita. Dunque, necessariamente, l'override implica ereditarietà Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Il modificatore final • Finalsignifica letteralmente «finale» o «non mutabile» • Tale modificatore, al pari di public e private, può essere preposto a un metodo, a un attributo o ad una classe: • preposto a una variabile la rende una costante per l'istanza della classe • preposto a un metodo, implica che in un contesto di ereditarietà su di esso non potrà essere eseguito l'override da parte della classe che eredita • una classe definita final non può essere ereditata. Questo semanticamente significa che la classe non necessita di specializzazioni o estensioni Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti
Il modificatore static • Applicabile a metodi e attributi di una classe • Dichiarare un metodo static lo rende di fatto comune a tutte le istanze della classe. La chiamata del metodo avviene senza istanziare la classe: • Anziché [nomeOggetto].[nomeMetodo]() si usa [nomeClasse].[nomeMetodo]() • Dichiarare un attributo static lo rende comune a tutte le istanze della classe • Un attributo public static è di fatto una variabile globale Programmazione MIDI (Prof. Luca A. Ludovico)20. Programmazione a oggetti