[oop] esercizio

Forum di discussione sul linguaggio Java e JSP

Moderatore: Toki

Regole del forum
Leggi: IProgrammatori.it - Regolamento Forum
Avatar utente
Cyrano
Utente Junior
Messaggi: 93
Iscritto il: 04 mag 2017, 18:02

[oop] esercizio

Messaggioda Cyrano » 19 mag 2017, 15:57

Buonasera,

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

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)

Codice: Seleziona tutto

    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

Codice: Seleziona tutto

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

Codice: Seleziona tutto

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


classe Attività

Codice: Seleziona tutto

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)

Codice: Seleziona tutto

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; }   
}

Avatar utente
andbin
Utente Senior
Messaggi: 2765
Iscritto il: 30 ott 2013, 21:51
Località: Torino
Contatta:

Re: [oop] esercizio

Messaggioda andbin » 19 mag 2017, 16:15

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.
Andrea, www.andbin.net — Senior Java developer — SCJP 5 (91%) – SCWCD 5 (94%)
Il mio blog sulla programmazione
+m2+
Utente Senior
Messaggi: 372
Iscritto il: 10 mag 2017, 18:22

Re: [oop] esercizio

Messaggioda +m2+ » 19 mag 2017, 16:17

... nota di servizio ... ti consiglio fortemente di NON usare caratteri quali à
Avatar utente
Cyrano
Utente Junior
Messaggi: 93
Iscritto il: 04 mag 2017, 18:02

Re: [oop] esercizio

Messaggioda Cyrano » 22 mag 2017, 21:53

Grazie a entrambi ho corretto i due errori.

Ho rivisto un pò tutto , e credo di aver mal interpretato un pò di cose f30

Torna a “Java”

Chi c’è in linea

Visitano il forum: Nessuno e 19 ospiti