Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Problema ereditarietà

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    369

    Problema ereditarietà

    Buongiorno a tutti.

    Io ho la classe Radice che ha due costruttori :
    public Radice()
    public Radice (int, String, String, String).

    Poi ho la classe Foglia extends Radice. Io vorrei che questa seconda classe avesse due costruttori anche lei, e che questi costruttori sovrascrivessero quelli della classe Radice. Ovvero io non vorrei che fosse possibile, dopo aver dichiarato un oggetto di tipo Foglia, inizializzarlo con un costruttore della classe radice. Il problema è che i due costruttori della classe foglia son diversi da quelli della classe radice :
    public Foglia()
    public Foglia(int, String)
    Come faccio a far si che il secondo costruttore della classe Radice non possa essere chiamato su Foglia?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema ereditarietà

    Originariamente inviato da alfa_19
    Io vorrei che questa seconda classe avesse due costruttori anche lei, e che questi costruttori sovrascrivessero quelli della classe Radice. Ovvero io non vorrei che fosse possibile, dopo aver dichiarato un oggetto di tipo Foglia, inizializzarlo con un costruttore della classe radice.
    Facciamo una premessa: i costruttori non sono metodi e non vengono mai "ereditati" (quindi non sono soggetti ad hiding o overriding).

    Se una classe A ha 2 costruttori, una sottoclasse B non ha (come detto sopra) quei 2 costruttori! Non li ha perché non li eredita. Chi scrive la classe B può dichiarare i costruttori che gli pare, purché ognuno di questi ad un certo punto invochi uno di quelli nella superclasse, perché ovviamente il processo di costruzione/inizializzazione deve arrivare fin su a java.lang.Object.

    La sottoclasse B può anche scegliere di "offrire" dei costruttori che in numero e parametri sono simili a quelli della superclasse.

    Es.

    Una classe Persona che ha 2 costruttori:
    codice:
    public Persona(String nome, String cognome) { ... }
    public Persona(String nome, String cognome, int annoNascita) { ... }
    Una sottoclasse Studente potrebbe scegliere di avere solo 1 costruttore:

    codice:
    public Studente(String nome, String cognome, int annoNascita) {
        super(nome, cognome, annoNascita);
    }
    oppure averne 2 nella stessa forma di quelli di Persona:
    codice:
    public Studente(String nome, String cognome) {
        super(nome, cognome);
    }
    public Studente(String nome, String cognome, int annoNascita) {
        super(nome, cognome, annoNascita);
    }
    Ma uno dei costruttori della superclasse lo deve invocare.

    Originariamente inviato da alfa_19
    Il problema è che i due costruttori della classe foglia son diversi da quelli della classe radice :
    public Foglia()
    public Foglia(int, String)
    Per quello di Foglia senza parametri è semplice: anche Radice ne ha uno senza parametri, quindi quello di Foglia può semplicemente invocare super(); e basta.

    Per il secondo di Foglia che ha int/String, dipende ..... in questo senso: i primi due di Foglia sono gli stessi primi due di quello di Radice? E per gli altri due puoi passare un "default"?

    Puoi fare, cioè ha senso per te:

    codice:
    public Foglia(int a, String b) {
        super(a, b, un_default, un_default);
    }
    Dove un_default sono i due String. Puoi passare un default es. null o una stringa?

    Se sì, hai risolto. Se no, allora qualcosa è da rivedere, nel senso che potresti ad esempio scegliere di invocare di nuovo super(); e fare tu "qualcosa" con i due a e b.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.