2013-02-22 11 views
15

Sto sviluppando in Android e ho una situazione relativamente semplice che sto cercando di implementare nel miglior modo possibile.Forza sottoclassi per impostare una variabile in java

Semplicemente, ho una classe che definisce tutti i parametri di base per un dato schermo. Da qui ogni schermata dell'applicazione è una sottoclasse di questo. Ho bisogno dello schermo ogni (cioè sottoclasse) per impostare il valore di una variabile nella sua implementazione (vale a dire, ogni schermata deve definire quale livello si trova in un albero di navigazione).

Inoltre, idealmente, questa variabile deve essere final quando è impostata nelle sottoclassi (mi rendo conto che probabilmente non è possibile).

Qual è il modo migliore per farlo? C'è un modo per applicare correttamente questo tipo di comportamento in Java?

+3

Questo non può essere fatto con una variabile. Ma una classe astratta può richiedere l'implementazione di un particolare metodo: questo metodo potrebbe restituire il valore applicabile. –

+0

Grazie! Avevo provato a seguire questa strada e sono rimasto bloccato con come forzare la chiamata alla funzione astratta. Ho avuto una mente vuota e ho dimenticato il costruttore no-arg e ho provato cose come costruttori astratti .... –

risposta

27

Il commento di @ pst ha portato a questa soluzione.

Questo non può essere fatto con una variabile. Ma una classe astratta può richiedere che un particolare metodo è implementato: questo metodo potrebbe restituire il valore applicabile

di dichiarare una funzione abstract per impostare o restituire la variabile, è possibile forzare qualsiasi sottoclasse per implementare correttamente.

Successivamente, la funzione deve essere chiamata da ogni singola sottoclasse della classe esterna. Ciò implica che deve essere fatto da qualche parte nella classe esterna. Questo può essere fatto nel costruttore senza argomenti della classe esterna, senza doversi preoccupare di sottoclassi di chiamata super:

Nota: se un costruttore non richiama esplicitamente un costruttore della superclasse, il compilatore Java inserisce automaticamente una chiamata a il costruttore senza argomenti della superclasse. Se la super classe non ha un costruttore senza argomenti, si otterrà un errore in fase di compilazione. L'oggetto ha un tale costruttore, quindi se Object è l'unica superclasse, non ci sono problemi. (Java docs: Super)

Sulla base di ciò, questa soluzione può contenere fino e correttamente forza la variabile da impostare il tempo che sia:

  1. Nessun altro costruttore viene creato nella superclasse (da qui eccellente può essere utilizzato in una sottoclasse per chiamare invece un altro costruttore)
  2. Tutti gli altri costruttori nella superclasse chiamano ancora internamente il costruttore predefinito

Il codice:

Superclass:

public abstract class SuperClass { 
    // Variable all inner classes must set 
    static int myVar = 0; 

    public SuperClass() { 
     myVar = giveValue(); 
    } 

    public abstract int giveValue(); 
} 

sottoclasse:

public class SubClass extends SuperClass { 

    @Override 
    public int giveValue() { 
     return 5; // individual value for the subclass 
    } 

} 
+1

Grazie! Salvato la mia giornata !! – DevAndroid

8

Invece di imporre a tali classi figlio di inizializzare i campi, è possibile seguire una strategia di composizione facendo in modo che il costruttore della classe prenda un parametro che implementa un'interfaccia che fornisce i campi che si desidera inizializzare.

Problemi correlati