/ / Accesso e modifica delle proprietà di una super classe dalla sottoclasse? - java, ereditarietà, polimorfismo, sottoclasse, superclasse

Accesso e modifica delle proprietà di una super classe dalla sottoclasse? - java, ereditarietà, polimorfismo, sottoclasse, superclasse

mentre cercavo di capire il polimorfismo eeredità, ho fatto un piccolo programma per dimostrare questi argomenti. Il programma consiste in una superclasse "Albero" e tre sottoclassi "Betulla", "Acero" e "Quercia". Il costruttore di Tree fa in modo che tutti gli alberi inizino con un'altezza di 20 e 200 foglie. In Tree I ho un metodo astratto chiamato grow ().

Ecco il codice per Tree:

public abstract class Tree {
private int height;
private int numberOfLeaves;

public Tree()
{
height = 20;
numberOfLeaves = 200;
}
public Tree(int aheight, int anum)
{
height = aheight;
numberOfLeaves = anum;
}

public int getHeight()
{
return height;
}

public int getNumberOfLeaves()
{
return numberOfLeaves;
}

public void setNumberOfLeaves(int anum)
{
numberOfLeaves = anum;
}
public abstract String getType();

public void setHeight(int aheight)
{
height = aheight;
}

public abstract void grow();

}

Ecco il codice in Birch per grow ().

public void grow()
{
int height = super.getHeight();
super.setHeight(height++);

int num = super.getNumberOfLeaves();

super.setNumberOfLeaves(num+=30);
System.out.println("The Birch is Growing...");

}

Tuttavia, quando chiamo codice per far crescere una serie di alberi, nessuna delle loro altezze o numero di foglie cambia. Ecco il codice che ho usato per popolare la matrice di alberi (l'ho fatto manualmente):

ArrayList<Tree> treeArray = new ArrayList<Tree>();

treeArray.add( new Oak());
treeArray.add(new Birch());
treeArray.add(new Maple());

Ed ecco il codice che ho usato per chiamare crescere:

for (Tree tree : treeArray)
{
tree.grow();

System.out.println("The " + tree.getType() + ""s height is " + tree.getHeight() + " and it"s number of leaves is "+ tree.getNumberOfLeaves() +".");
}

Chiaramente, i valori nella superclasse non vengono modificati, ogni aiuto sarà apprezzato! Grazie!

risposte:

1 per risposta № 1

Cambia il tuo codice in:

int height = super.getHeight();
super.setHeight(++height);

si noti che non è necessario chiamare super.method (). Finché il metodo è protetto (pubblico ancora meglio), è sufficiente semplificarlo per:

int height = getHeight();
setHeight(++height);

Chiami solo super. se si implementa nuovamente il metodo nella classe figlia e si desidera chiamare in modo specifico la classe genitore, che di solito può essere vista nel costruttore che chiama il costruttore genitore.

Un'altra cosa: la tua accessor deve essere cambiata un po 'solo per i casi di precauzione. vedi il codice qui sotto. Di solito il tuo IDE dovrebbe supportare la generazione automatica di accessor.

    public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;

}

1 per risposta № 2

Questo codice:

int height = super.getHeight();
super.setHeight(height++);

non cambierà nulla, perché l'incremento di height si verificherà dopo la chiamata a super.setHeight(). Quindi stai solo impostando l'altezza sul valore corrente.