/ / Uzyskiwanie dostępu i modyfikowanie właściwości super klasy z podklasy? - java, dziedziczenie, polimorfizm, podklasa, nadklasa

Uzyskiwanie dostępu i modyfikowanie właściwości super klasy z podklasy? - java, dziedziczenie, polimorfizm, podklasa, nadklasa

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 № 1

Zmień 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ść.