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.