1 / 15

Programmazione a oggetti

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

Télécharger la présentation

Programmazione a oggetti

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lezione 20 Programmazione a oggetti Programmazione MIDI (Prof. Luca A. Ludovico)

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

More Related