Visualizzazione dei risultati da 1 a 8 su 8

Discussione: SUPER Costruttore

  1. #1

    SUPER Costruttore

    Salve,

    sto facendo un po' di prove con due classi che ho creato, IMPIEGATO e DIRIGENTE.
    Dirigente è una classe derivata da Impiegato.
    Gli attributi della classe Impiegato sono nome, cognome e codice fiscale. La classe dirigente estende impiegato aggiungendo l'attributo booleano reperibilità.
    Per la classe Impiegato utilizzo il costruttore di default ed uno con il solo attributo nome, mentre per quella Dirigente vorrei usare il costrutto super così:

    public Dirigente(String nome, float stipendio, String codiceFiscale, boolean reperibilita){
    super(pNome, pStipendio, pCodiceFiscale);
    this.reperibilita = reperibilita;}

    Il compilatore però mi dice che il costruttore Impiegato(String) non è definito. Qualcuno sa dirmi perchè?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da sandonatese Visualizza il messaggio
    Per la classe Impiegato utilizzo il costruttore di default ed uno con il solo attributo nome

    public Dirigente(String nome, float stipendio, String codiceFiscale, boolean reperibilita){
    super(pNome, pStipendio, pCodiceFiscale);
    this.reperibilita = reperibilita;}

    Il compilatore però mi dice che il costruttore Impiegato(String) non è definito. Qualcuno sa dirmi perchè?
    Se in Impiegato ci sono solo:

    public Impiegato()
    e
    public Impiegato(String nome)

    è chiaro che in un costruttore di Dirigente una invocazione super(pNome, pStipendio, pCodiceFiscale); non corrisponde a nessuno dei due!

    Quindi o modifichi/aggiungi un costruttore in Impiegato, oppure passi al super-costruttore solo quello puoi attualmente e il resto lo passi a dei setter.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ciao, grazie per la risposta.

    ho un costruttore public Impiegato(String nome, float stipendio, String codiceFiscale) nella Classe impiegato

    Nella classe Dirigente ho il costruttore:

    public Dirigente (String nome, float stipendio, String codiceFiscale, boolean reperibilita){
    super(pNome, pRetribuzione, pCodiceFiscale);
    this.reperibilita = reperibilita;
    }

    Il compilatore mi dice che i parametri pNome ecc non possono essere risolti in variabile. Sai mica dirmi dove sbaglio? Grazie

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non avrai dichiarato quelle variabili... Se posti il codice ti diciamo cosa c'è di errato...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Beh, si vede anche ad occhio... le variabili passate al costruttore di Dirigente si chiamano, rispettivamente "nome", "stipendio", "codiceFiscale"... quindi, perchè quella "p" davanti?

    PS: se per caso intendi "passare" delle variabili "di istanza" (premesso che il compilatore, comunque, non le trova), allora stai sbagliando qualcosa: non puoi costruire un oggetto della superclasse passandogli come parametri oggetti della sottoclasse, visto che quest'ultima ancora non esiste (non è stata creata).

    Se sei in una situazione in cui hai una classe B che estende A, per costruire un oggetto di tipo B deve prima esistere un oggetto di tipo A... ed è a questo che serve l'invocazione a super(). Ovviamente, solo dopo che è stato istanziato A, può essere istanziato B.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Ciao. Premetto che volevo solo fare alcune prove per utilizzare il costrutto SUPER dentro un costruttore.
    Il punto è che i costruttori di Impiegato (superclasse) e Dirigente (sottoclasse) hanno le stesse variabili di istanza, eccetto reperibilità. Quindi pensavo di sovrascrivere il costruttore di Impiegato per creare quello di Dirigente. I parametri del costruttore "Dirigente" e di "super" non devono avere nomi diversi?
    Grazie

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Non possono avere nomi diversi perché per passare delle variabili tramite il super tu quelle variabili le devi avere, nel senso che devono esistere. Se tu hai per esempio nel costruttore di DIRIGENTE le variabili nome, stipendio, codiceFiscale devi passare per forza tramite il super le stesse variabili e quindi super(nome, stipendio, codiceFiscale).
    Se tu passassi per esempio (come hai fatto) super(pNome, pRetribuzione, pCodiceFiscale) queste sono altre variabili, infatti hanno un nome diverso da quelle ricevute nel costruttore e non avendole inizializzate il compilatore non le vede come variabili!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da sandonatese Visualizza il messaggio
    Il punto è che i costruttori di Impiegato (superclasse) e Dirigente (sottoclasse) hanno le stesse variabili di istanza
    Impiegato e Dirigente sono due classi diverse... a nessuna delle due importa nulla di come si chiamino i "parametri formali" del costruttore dell'altra... tanto quelli sono visibili solo dentro il costruttore e servono solo a referenziare i valori che gli vengono passati. Puoi anche chiamarli con nomi diversi, non cambia nulla (le due classi non vedono i corrispettivi nomi dei parametri formali).

    Quindi pensavo di sovrascrivere il costruttore di Impiegato per creare quello di Dirigente.
    Cioè? Cosa vuol dire? E, prima ancora domandati: che senso ha? Ciascuna classe ha vita propria... il costruttore di una determinata classe deve essere fatto solo in funzione del funzionamento della classe. Impiegato non sa nulla (e non deve sapere nulla!) dell'esistenza di una classe Dirigente che la estende... un domani potrebbero esserci 100 classi diverse che estendono Impiegato e lei non deve saperne nulla... non ha senso che sappia qualcosa delle classi che la estendono.

    I parametri del costruttore "Dirigente" e di "super" non devono avere nomi diversi?
    Grazie
    E perchè mai? Ripeto: I nomi dei parametri formali di un qualunque metodo non servono a nessuno se non al metodo stesso. Nascono e muoiono all'interno del metodo.

    Quando tu richiami un metodo e gli passi un valore cosa sai del nome del parametro formale che riceverà il tuo valore?

    Esempio:

    codice:
    Integer mioInt = new Integer( 5 );

    Cosa sai di come si chiama il parametro formale che riceverà il valore 5? Si chiama "num"? Si chiama "value"? Si chiama "pippo"? Si chiama "x"? Non lo sai e non te ne frega nulla di saperlo. Lo stesso dicasi per qualunque classe esistente o che scriverai in futuro.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.