[oop] esercizio

di il
3 risposte

[oop] esercizio

Buonasera,

ho scritto questo esercizio sulla falsa riga di altri per esercitarmi sulle sottoclassi, ma non ho capito un paio di cose

Il testo dell'esercizio è il seguente:
<<
Si progetti una classe con relative sotto classi , utile a gestire un attività di manutenzione dove un responsabile prende in carico
la richiesta di servizio e scelga quale azienda presente in anagrafica sia più adatta allo scopo e registri il nome del tecnico(del fornitore) per l'esecuzione dei lavori.>>


In Evidenza ( Main)

    System.out.println(attività.getAssistente());
    
    System.out.println(odl.getAssistente());
    System.out.println(attività.getAssistenteAttività());

1) Perchè attività.getAssistente()); è null ?Non dovrei ereditare il metodo della classe OdL e relativo attributo ?
2) la parola chiave Super fa riferimento al parent e quind alla classe che sta "sopra" e senza di quello non posso creare il costruttore nella sotto classe ,almeno ho capito così..Ma a cosa serve?Posso usare il valore all'interno di "super ()"

Grazie

Main

public class ProvaSottoClasse {

    static int nOdL;

    public static void main(String[] args) {
       
    Attività attività;
    OdL odl ;   // Ordine di lavoro
    
    /* azione di Assistente prende in carico richiesta di servizio e crea odl */
    odl = new OdL(Integer.toString(nOdL++));
     
    /* azione del software */
    odl.setAssistente("Rossi Luca");
    
    /* azione di Assistente sceglie codice fornitore */
    odl.setService(800065);
   
    /* azione di Assistente crea un'attività */
    attività = new Attività ("Verifica pompa n°1");
    /* azione di Assistente assegna attività a tecnico fornitore */
    attività.setAssistenteAttività("Piero Verdi");
    
    System.out.println(attività.getAssistente());
    
    System.out.println(odl.getAssistente());
    System.out.println(attività.getAssistenteAttività());

    }
}
classe Assistente

public class Assistente{
    
    private String Assistente;
    
    protected Assistente (String name) {this.Assistente = name;}
    
}
classe Attività

public class Attività extends OdL {
    
    private String AssistenteAttività;
    
    protected Attività(String descrizione) {
        super(descrizione);
    }
    protected void setAssistenteAttività ( String name){ this.AssistenteAttività = name;}
    protected String getAssistenteAttività (){ return this.AssistenteAttività; }
    
}
classe OdL (ordine di lavoro)

public class OdL extends Assistente {
    
    private int odl;
    private int code;
    private String Assistente;
    
    protected OdL(String descrizione) {
        super(descrizione);
    }
    
    protected void setOdl ( int number) { this.odl = number; }
    protected void setService ( int number) {this.code = number; }
    protected void setAssistente ( String name) {this.Assistente = name; }
    protected String getAssistente () { return this.Assistente; }

    public int GetOdl() { return odl; }
    public int GetService () { return code; }   
}

3 Risposte

  • Re: [oop] esercizio

    Cyrano ha scritto:


    1) Perchè attività.getAssistente()); è null ?Non dovrei ereditare il metodo della classe OdL e relativo attributo ?
    Attenzione, perché hai 2 campi private String Assistente. Uno in Assistente e l'altro in OdL.
    Quando fai

    attività = new Attività ("Verifica pompa n°1");

    "Verifica pompa n°1" viene passato al costruttore di Attività, che lo passa al costruttore di OdL, che lo passa al costruttore di Assistente, il quale ... lo mette nel campo Assistente di Assistente, NON di OdL.
    Poi quando fai

    attività.getAssistente()

    stai usando il getAssistente di OdL che prende il campo Assistente di OdL (che è rimasto null) e non quello di Assistente (che è stato inizializzato tramite la catena di costruttori).

    Il codice comunque è parecchio confuso, i nomi non sono buoni (una classe Assistente e campi Assistente) e non dovresti neanche mettere il corpo dei metodi su una riga sola come

    protected void setAssistente ( String name) {this.Assistente = name; }
    protected String getAssistente () { return this.Assistente; }

    perché non è molto leggibile e oltretutto ti dà grane al debugging.


    Consiglio personale: prova prima con altri esercizi più semplici e lineari riguardo ereditarietà/polimorfismo. Tipo ad esempio (se non l'hai già fatto) il classico scenario delle figure geometriche (bidimensionali oppure tridimensionali, a scelta).

    Cyrano ha scritto:


    2) la parola chiave Super fa riferimento al parent e quind alla classe che sta "sopra" e senza di quello non posso creare il costruttore nella sotto classe ,almeno ho capito così..Ma a cosa serve?Posso usare il valore all'interno di "super ()"
    super usato come invocazione super( ...eventuali argomenti... ) serve per invocare il costruttore della superclasse. E può essere fatto solo come PRIMA istruzione di un costruttore.
  • Re: [oop] esercizio

    ... nota di servizio ... ti consiglio fortemente di NON usare caratteri quali à
  • Re: [oop] esercizio

    Grazie a entrambi ho corretto i due errori.

    Ho rivisto un pò tutto , e credo di aver mal interpretato un pò di cose
Devi accedere o registrarti per scrivere nel forum
3 risposte