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

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

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

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

Programmazione a oggetti

Lezione 20

Programmazione MIDI (Prof. Luca A. Ludovico)

Page 2: Programmazione a oggetti Lezione 20 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

Page 3: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 4: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

Esempio di ereditarietà

• Si consideri il rapporto gerarchico tra la superclasse Animale e la sottoclasse Felino:– l’attributo genere sarà comune a tutti gli animali, il cui genere

sarà sempre maschile o femminile, al limite indefinito;– Il metodo calcolaEta, che combina l’attributo data_nascita

con la data corrente per restituire il numero di anni dell’esemplare, sarà definito nella superclasse, e rimarrà valido per tutte le sottoclassi che ereditano (l’età si calcola allo stesso modo per tutti gli esseri viventi)

– un felino avrà però dei descrittori più specifici rispetto a un generico animale (si pensi al colore del pelo, attributo che non avrebbe senso per un generico animale, che potrebbe essere squamato, piumato, ecc.)

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

Page 5: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 6: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 7: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

La gerarchia di classi in JAVA

• La superclasse Object contiene metodi generali, disponibili a tutte le classi che ereditano (quindi a tutte le classi), tra cui:– Object clone()

crea e restituisce una copia dell’oggetto corrente– boolean equals(Object obj)

indica se un altro oggetto è uguale a questo– String toString()

restituisce una rappresentazione a stringa di testo dell’oggetto

• Esempio: invocare il metodo toString() su una classe definita dall’utente che non ne contiene una propria versione

• Esempio: ridefinire il metodo toString() in una classe definita dall’utente

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

Page 8: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

Assegnamento tra oggetti

• L’operatore di assegnamento funziona tra oggetti della stessa classe

• Poichè una superclasse è più generica di una sottoclasse:– è sempre possibile assegnare un oggetto di una sottoclasse a un oggetto di

una superclasse.– non è possibile (e genera errore a compile-time) assegnare un oggetto di una

superclasse a un oggetto di una sottoclasse

• EsempioMusicSymbol a = new MusicSymbol ();

MusicSymbol b = new MusicSymbol ();

a = b; // ok

MusicNote n = new MusicNote(); // MusicNote eredita da MusicSymbol

a = n; // ok

n = a; // no!!!

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

Page 9: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

Cast delle variabili

• Tramite il cast si può specificare al compilatore che un oggetto di classe A è della classe B più specifica

Object o = "str"; String str = (String)o;

• Possibili errori: effettuare il cast di oggetti che appartengono – a rami diversi della gerarchia

String o = "str"; Integer i = (Integer)o; // Errore a compile-time

– allo stesso ramo ma cmq non sono “castabili”, il che solleva a run-time un’eccezione ClassCastException

Number o = new Integer(5);

Double n = (Double)o; // Solleva ClassCastException

• Uso tipico: passare da un tipo più generale a uno più specifico. Ad esempio Integer eredita da Number (tutti gli interi sono numeri ma non viceversa: ad esempio Double, Float, Byte, Long)

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

Page 10: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

I modificatori d’accesso protected e (default)

• Protected può 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

Page 11: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Modificatore Stessa classe Stesso package

Sottoclasse Ovunque

Public sì sì sì sì

Protected sì sì sì no

(default) sì sì no no

Private no no no no

Page 12: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

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 metodo che effettua override deve avere lo stesso nome, stesso numero e tipo di parametri, e stesso tipo restituito rispetto a quello originario– può anche restituire un sottotipo del tipo restituito (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

Page 13: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 14: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

Il modificatore final

• Final significa 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

Page 15: Programmazione a oggetti Lezione 20 Programmazione MIDI (Prof. Luca A. Ludovico)

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