podczas próby zdobycia wiedzy o polimorfizmie idziedziczenia, zrobiłem mały program, aby zademonstrować te tematy. Program składa się z superklasy "Drzewo" i trzech podklas "Brzoza", "Klon" i "Dąb". Konstruktor drzewa sprawia, że wszystkie drzewa zaczynają się od wysokości 20 i 200 liści, w drzewie mam abstrakcyjną metodę o nazwie grow ().
Oto kod drzewa:
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();
}
Oto kod w Brzozie dla 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...");
}
Jednakże, gdy wywołuję kod, aby utworzyć szereg drzew, nie zmienia się ich wysokość ani liczba liści. Oto kod, którego użyłem do wypełnienia tablicy drzew (zrobiłem to ręcznie):
ArrayList<Tree> treeArray = new ArrayList<Tree>();
treeArray.add( new Oak());
treeArray.add(new Birch());
treeArray.add(new Maple());
A oto kod, którego użyłem do wywołania:
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() +".");
}
Oczywiście, wartości w superklasie nie są modyfikowane. Każda pomoc będzie doceniona! Dzięki!
Odpowiedzi:
1 dla odpowiedzi № 1Zmień swój kod na:
int height = super.getHeight();
super.setHeight(++height);
zwróć uwagę, że nie musisz wywoływać super.method (). Dopóki metoda jest chroniona (publicznie jeszcze lepiej), możesz po prostu uprościć ją do:
int height = getHeight();
setHeight(++height);
Dzwonisz tylko super. jeśli ponownie zaimplementujesz tę metodę w klasie potomnej i chcesz wywołać konkretnie klasę nadrzędną, którą zazwyczaj można zobaczyć w konstruktorze wywołującym konstruktor macierzysty.
Jeszcze jedno: twój akcesor musi zostać nieco zmieniony tylko dla zachowania ostrożności. zobacz kod poniżej. Zwykle IDE powinno obsługiwać automatyczne generowanie akcesora.
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
1 dla odpowiedzi nr 2
Ten kod:
int height = super.getHeight();
super.setHeight(height++);
nie zmieni niczego, ponieważ przyrost height
wystąpi po wezwanie do super.setHeight()
. Więc właśnie ustawiasz wysokość na aktualną wartość.