/ / Prístup a úprava vlastností supertriedy z podradenej triedy? - java, dedičnosť, polymorfizmus, podtrieda, supertrieda

Prístup a úprava vlastností supertriedy z podradenej triedy? - java, dedičnosť, polymorfizmus, podtrieda, superclass

zatiaľ čo sa snaží získať pochopenie polymorfizmu adedičstvo, urobil som malý program na demonštráciu týchto tém. Program pozostáva z superclass "Tree" a troch podtried "Birch", "Maple" a "Oak". Konštruktér stromu robí tak, že všetky stromy začínajú s výškou 20 a 200 listov. V strome Mám abstraktnú metódu nazvanú rast ().

Tu je kód pre 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();

}

Tu je kód v Birchu pre rast ().

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...");

}

Keď však zavolám kód, aby rástol rast stromov, nezmení sa ich výška ani počet listov. Tu je kód, ktorý som použil na zaplnenie poľa stromov (urobil som to ručne):

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

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

A tu je kód, ktorý som nazýval rast:

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() +".");
}

Je zrejmé, že hodnoty v nadtriede nie sú modifikované, akákoľvek pomoc bude ocenená!

odpovede:

1 pre odpoveď č. 1

Zmeňte svoj kód na:

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

Všimnite si, že nepotrebujete zavolať super.method (), ak je metóda chránená (verejné ešte lepšie), môžete ju jednoducho zjednodušiť na:

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

Voláte len super. ak implementujete metódu znova v triede vášho dieťaťa a chcete konkrétne zavolať na materskú triedu, ktorá sa zvyčajne dá vidieť v konštruktore, ktorý volá konštruktéra.

Ešte jedna vec: váš prídavný príslušník musí byť trochu zmenený len pre prípad predbežnej opatrnosti. viď kód nižšie. Zvyčajne vaša IDE by mala podporovať automatické generovanie príslušenstva.

    public int getHeight() {
return height;
}

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

}

1 pre odpoveď č. 2

Tento kód:

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

nebudú nič meniť, pretože prírastok height objaví sa po volanie na super.setHeight(), Takže len nastavujete výšku na svoju aktuálnu hodnotu.