PDA

Visualizza la versione completa : java - rieccomi!!! questa volta ereditarietà


gioconda
30-03-2003, 16:13
Salve a tutti:-)

Scusate la rottura di scatole di questi miei continui messaggi per cose banali, ma sto studiando da sola per collaborare ad un progetto che partirà tra non molto tempo, e se mi blocco (come in questo caso) rischio di restare due giornate impantanata sulla stessa cosa.

Il problema questa volta è l' ereditarietà. Una classe famiglia, nel quale vengono definiti padre e madre, una classe figli che estende famiglia nella quale definisco figlio e figlia. Solo che alla fine, quando chiedo i nomi di tutti i componenti, mi restituisce solo i nomi dei figli, per padre e madre mette "null", quindi è evidente che non "eredita" come dovrebbe. Dove sto sbagliando?

public class Famiglia {

public String padre;
public String madre;

public void setGenitori(String padre, String madre) {

this.padre=padre;
this.madre=madre;
}

public String getPadre() {

return this.padre;
}

public String getMadre() {

return this.madre;
}
}

class Figli extends Famiglia {

public String padre;
public String madre;
public String figlio;
public String figlia;

public void setFigli(String figlio, String figlia) {

this.figlio=figlio;
this.figlia=figlia;
}

public String getFiglio() {

return this.figlio;
}

public String getFiglia() {

return this.figlia;
}

public void risposta2() {
System.out.println("Quindi i nomi di tutti i componenti della famiglia sono: " + this.padre+" " + this.madre+" " + this.figlio+ " "+ this.figlia);

}

}

public class FamigliaDemo {

public static void main(String args[]) {

Famiglia family=new Famiglia();

family.setGenitori("Tiziano" ,"Carla");

Figli sons=new Figli();

sons.setFigli("Gianni", "Lucia");

sons.risposta2();

}

}

Xadoom
30-03-2003, 16:32
Credo sia perchè hai scritto:



System.out.println("Quindi i nomi di tutti i componenti della famiglia sono: " + this.padre+" " + this.madre+" " + this.figlio+ " "+ this.figlia);


Non capisco perchè metti this.padre,this.figlio,etc etc....
puoi mettere semplicemente padre,figliio,etc,etc,....
oppure cambia in:
super.padre e super.madre
Così dovrebbe andare meglio....
credo.:gren:

gioconda
30-03-2003, 16:36
Falso allarme, ci sono riuscita, non avevo impostato nella classe figli anche le variabili per padre e madre!!!

Hai ragione, sarebbe molto più facile anche per me, ma mi hanno espressamente chiesto di utilizzare set get e variabili, a quanto pare li utilizzano molto...

gioconda
30-03-2003, 16:37
set get e metodi...:-)

Xadoom
30-03-2003, 16:40
No, allora l'errore è di concetto:
se figli espande famiglia non devi poi creare due classi, come fai qui:


public class FamigliaDemo {

public static void main(String args[]) {

Famiglia family=new Famiglia();

family.setGenitori("Tiziano" ,"Carla");

Figli sons=new Figli();

sons.setFigli("Gianni", "Lucia");

sons.risposta2();


ma creare solo la classe figli!!
Tuttavia devi aggiungere il metodo setGenitori(String,String) nella classe figli, ed iniziarizzarla!
Forse non sono stato chiaro:
il fatto è che in realtà i figli non sono delle sottoclassi di famiglia!
E perchè hai messo solo i genitori nella famiglia??
Credo dovresti fare così:

1)classe Genitore
setNome(String)
setCognome
2)classe Figlio(Genitore) estende Genitore
setNome(String)
importa il cognome del genitore
3)classe Famiglia
setFamiglia(){
new Figlio
new Genitore
}
mostraFamiglia()

Spero di essermi chiarito...
Bah

gioconda
30-03-2003, 16:45
si infatti avevo anche sbagliato nel file FamigliaDemo a creare l'oggetto Famiglia, ora è più chiaro il concetto di ereditarietà, anche se mi chiedo se in effetti sia così utile... non va bene lo stesso integrare il codice (in questo caso della classe Famiglia) per aggiungere ciò che manca?

Magari a livelli diversi da quello base potrà essere anche utile, al momento mi sfugge

misteri della programmazione?!?

r0x
30-03-2003, 17:04
E grazie e` un pastrocchio! :D



public class Famiglia
{
// campi incapsulati, ma visibili alle classi derivate (e non so per quale progettista IDIOTA anche al package)

protected String padre;
protected String madre;

public void setGenitori( String padre, String madre )
{
this.padre = padre;
this.madre = madre;
}

// in questi metodi 'this' e` superfluo

public String getPadre()
{
return padre;
}
public String getMadre()
{
return madre;
}
}

class Figli extends Famiglia
{
// padre, madre e rispettivi get/set sono ereditati

protected String figlio;
protected String figlia;

public void setFigli( String figlio, String figlia )
{
this.figlio = figlio;
this.figlia = figlia;
}

public String getFiglio()
{
return figlio;
}
public String getFiglia()
{
return figlia;
}

public String toString()
{
return "Padre: " + padre + ", Madre: " + madre + ", Figlio: " + figlio + ", Figlia: " + figlia;
}
}


Inoltre ti ricordo che Java si fonda _pesantemente_ su ereditarieta` e polimorfismo. Conta che tutto deriva da Object.. :eek:

Zero-2
30-03-2003, 18:05
public class Prova4 {

public static void main(String []args){
Figli figli=new Figli();
figli.setFigli("Pino","Pina");
figli.setGenitori("Maria","Maria");
System.out.println(figli);
}
}


Figli ereditando da Famiglia , non necessita di una riscrittura del metodo setGenitori(),a meno che non debba migliorarlo o cambiargli il funzionamento.
Volendo potresti scrivere nella classe Figli

public void setGenitori(String padre,String madre){
super.setGenitori(padre,madre);
}

ma diciamo che non ha senso :)
Inoltre l'ereditarietà è utile quando si creano classi astratte che ti dicono come deve essere impostata una classe che eredità da quest'ultima.


Ciauz

gioconda
30-03-2003, 18:35
Grazie per i consigli,
ci sto lavorando sopra per focalizzare bene gli argomenti!!!

Ciao ciao:dhò: :dhò: :dhò: :dhò:

gioconda
30-03-2003, 19:21
scusa rOx, ma potresti spiegarmi perchè hai deciso di mettere le variabili padre e madre come protected?

Quale è l'utilità di questa scelta?

Loading