Sei sulla pagina 1di 4

1

Classi astratte
Definizione di classe astratta
Una classe che contiene almeno un metodo astratto detta classe astratta. Una classe astratta pu contenere variabili di istanza e metodi non astratti. Una classe pu essere dichiarata astratta anche se non ha metodi astratti.

Per dichiarare una classe astratta si utilizza la sintassi seguente: abstract class <nome classe> Un metodo astratto un metodo per il quale non stata fornita alcuna implementazione; per esempio: public abstract metodoAstratto(); Di conseguenza, una classe astratta ha almeno un metodo privo di implementazione, anche se ci non strettamente necessario.

A che cosa serve una classe astratta?


Risalendo la gerarchia di ereditariet, le classi diventano sempre pi generiche. Ad un certo punto, la classe antenata diventa cos generica da poter essere considerata una struttura portante per le altre classi , pi che una classe con istanze specifiche utilizzabili.1 Consideriamo nuovamente la gerarchia di classi.

P ersona

Im pi eg ato

S tud ente

public class Persona { private String nome; public String getNome() { return nome; } .. }
1

Tratto da C. S. Horstmann, G. Cornell, Java2 I fondamenti, sesta edizione, Mc Graw Hill, 2003

Bocchi Cinzia Ultimo aggiornamento: 30/09/2011

public class Studente extends Persona { private String corsoLaurea; .. } public class Impiegato extends Persona { private double stipendio; . } Supponiamo di voler definire un metodo getDescrizione che restituisca una breve descrizione della persona. In particolare si vuole ottenere: per un impiegato, la visualizzazione dello stipendio; per uno studente, il corso di laurea. E evidente che la classe Persona non ha informazioni sullo stipendio dellimpiegato e sul corso di laurea a cui lo studente iscritto. Tali informazioni sono contenute allinterno delle rispettive sottoclassi. Ci troviamo quindi di fronte a 2 possibilit: 1. definire il metodo solo allinterno delle sottoclassi; 2. definire il metodo come astratto, cio senza specificare il codice, nella superclasse e implementare il metodo in ciascuna sottoclasse. Nel primo caso il codice diventa public class Persona { private String nome; public String getNome() { return nome; } } public class Studente extends Persona { private String corsoLaurea; public String getDescrizione() { return Lo studente frequenta +corsoLaurea; } } public class Impiegato extends Persona { private double stipendio; public String getDescrizione() {
Bocchi Cinzia Ultimo aggiornamento: 30/09/2011

3
return Limpiegato ha uno stipendio pari a +stipendio;

} }

Nel seguito vedremo che la seconda possibilit pi flessibile della prima e quindi preferibile. Tuttavia, se scegliamo la seconda possibilit, il metodo getDescrizione della superclasse sar astratto e, di conseguenza, dovr essere definita come astratta anche la classe Persona. public abstract class Persona { private String nome; public String getNome() { return nome; } public abstract String getDescrizione(); } public class Studente extends Persona { private String corsoLaurea; public String getDescrizione() { return Lo studente frequenta +corsoLaurea; } } public class Impiegato extends Persona { private double stipendio; public String getDescrizione() { return Limpiegato ha uno stipendio pari a +stipendio; } } Il metodo astratto getDescrizione funge da segnaposto per i metodi implementati nelle sottoclassi: il codice del metodo pu cambiare da sottoclasse a sottoclasse; la firma del metodo (nome, tipo restituito, specificatori di accesso, parametri) rimane la stessa.

Come si utilizza una classe astratta?


Le classi astratte non possono essere istanziate, cio non possibile creare un oggetto di una classe astratta. Per esempio, listruzione: Persona p= new Persona(); restituisce il seguente errore in fase di compilazione
Bocchi Cinzia Ultimo aggiornamento: 30/09/2011

4 Persona is abstract; cannot be instantiated


Tuttavia possibile creare oggetti di sottoclassi concrete, nel seguente modo: Persona stu= new Studente(...); Persona imp= new Impiegato(...); stu e imp sono variabili di tipo Persona ma fanno riferimento a istanze di Studente e impiegato, rispettivamente. Naturalmente sempre possibile creare direttamente unistanza delle 2 sottoclassi: Studente stu= new Studente(...); Impiegato imp= new Impiegato(...); ma esistono notevoli vantaggi nellutilizzare il formalismo precedente. In particolare, supponiamo di voler creare un array contenente oggetti Persona, siano essi impiegati o studenti e di voler ottenere la descrizione per tutti gli elementi dellarray. Se non definiamo il metodo getDescrizione come metodo astratto della classe Persona, il seguente codice restituisce errore in fase di compilazione. public class TestClasseAstratta { public static void main(String[] args) { Persona[] array= new Persona[2]; array[0]= new Studente(); array[1]= new Impiegato(); System.out.println(array[0].getDescrizione()); System.out.println(array[1].getDescrizione()); } } Lerrore il seguente

cannot find symbol: method getDescrizione()


ed dovuto al fatto che la classe Persona non ha un metodo getDescrizione(). Definendo getDescrizione come metodo astratto di Persona, lerrore non si verifica.

___________________________________________________________________
Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Bocchi Cinzia Ultimo aggiornamento: 30/09/2011

Potrebbero piacerti anche