Override e classe anonima

di il
1 risposte

Override e classe anonima

Salve a tutti,

sto studiando l'ereditarietà e l'override dei metodi.

In particolare, devo implementare questa classe:

Scrivere una classe astratta Java Opera, contenente i campi privati nome (String) e anno (int), durata(int), valutazioni (int[]) e i seguenti metodi d'istanza:
..
..diversi metodi già implementati
..

public abstract void descrizioneOpera() : stampa una descrizione testuale dell’opera. Nota: il metodo e' abstract: le classe figlie dovranno implementare tale metodo.


Opera:
public abstract class Opera 
{
    private String nome;
    private int anno;
    private int durata;
    private int[] valutazioni = new int[0];

    //vari metodi già implementati 
    ---
    --
    public abstract void descrizioneOpera(); 
}    
Giustamente descrizioneOpera non ha un corpo, proprio perché è un metodo astratto.

Ora, quando vado nel main e istanzio un oggetto di tipo opera:
Opera prima = new Opera("Back in black", 1980, 3);
la jmv mi dice: Opera is abstract; cannot be instantiated.

Così, faccio come mi consiglia l'IDE: Implement all abstract methods.

Ed ecco qui, nel main:
Opera prima = new Opera("Back in black", 1980, 3) {

 @Override
  public void descrizioneOpera() 
   {
                    
   }
};
Da quello che ho capito questo è un caso di classe anonima, in quanto sto dichiarando e contemporaneamente istanziando una classe. Giusto?

Come richiesto dalle specifiche descrizioneOpera deve stampare una descrizione testuale dell'opera.
Dunque se, per esempio, facessi:
Opera prima = new Opera("Back in black", 1980, 3) {

@Override
  public void descrizioneOpera() 
   {
       System.out.print(prima.getTitolo()); //getTitolo fa un return del nome dell'opera
   }
};
mi salterebbe fuori questo errore:

local variables referenced from an inner class must be final or effectively final

Ovvero, le variabili locali di riferimento da una classe interna devo essere final..

Cosa devo fare?

Grazie

1 Risposte

  • Re: Override e classe anonima

    Se proprio vuoi risolvere usando la soluzione che hai impiegato (cioe' quella proposta da NetBeans), ti basta dichiarare l'oggetto "prima" come final:
    
    final Opera prima = new Opera("Back in black", 1980, 3)
    
    Tuttavia, sarebbe meglio pensare un attimo alla modellizzazione suggerita: se si dichiara una classe abstract, significa che la si utilizza per raggruppare un insieme di caratteristiche comuni ad un insieme di classi, ma che non esiste in realta'.
    Per esempio, se dichiaro astratta la classe veicolo e ci metto dei metodi, posso essere sicuro che tutti i veicoli (che sono classi sottostanti) godranno di dette caratteristiche. La classe veicolo non corrisponde ad un vero veicolo, e' un nome generico per denominare tutte le caratteristiche comuni. La automobili, che sono veicoli, godranno di queste proprieta'. La stessa cosa qui.
    Nel caso dei veicoli, dichiarare un oggetto anonimo equivale ad aver creato un prototipo di veicolo, una "concept car" del quale si produce un solo esemplare. Utile certo, ma lo puoi vedere come un caso particolare.

    Riprendendo il tuo esempio: potresti provare ad estendere la tua classe Opera con le classi Melodramma e Farsa (senza buttarla in politica ), assumendo che siano due tipi CONCRETI di Opera (che nella nostra modellizzazione e' il nome generico per indicarle).
    In queste due classi sarai obbligato ad implementare i metodi che hai dichiarato astratti in Opera (a meno che non le dichiari anch'esse abstract, ovviamente).
    Poi le potrai utilizzare tutte le volte che ti serve un oggetto di tipo Opera, perche' effettivamente SONO di tipo Opera.

    Opera prima = new Farsa("Jeu de la fueillée", 1276, 3);
Devi accedere o registrarti per scrivere nel forum
1 risposte