/ / Достъп и промяна на свойствата на супер клас от подклас? - java, наследство, полиморфизъм, подклас, суперклас

Достъп и промяна на свойствата на супер клас от подклас? - java, наследство, полиморфизъм, подклас, суперклас

докато се опитват да разберат полиморфизма иНаследството направих малка програма, която да демонстрира тези теми. Програмата се състои от класа "Дърво" и три подкласа "Birch", "Maple" и "Oak". Дървовидният конструктор го прави така, че всички дървета да започнат с височина от 20 и 200 листа. В дървото имам абстрактен метод, наречен расте ().

Тук е кодът за 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();

}

Тук е кода в Birch за расте ().

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

}

Въпреки това, когато се обаждам на код, за да направят масив от дървета растат, никоя от техните височини или брой листа не се променя. Тук е кода, който използвах, за да напълня масивите от дървета (направих го ръчно):

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

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

И тук е кодът, когото наричах растат:

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

Ясно е, че стойностите в суперкласът не се променят.Всяка помощ ще бъде оценена! Благодаря!

Отговори:

1 за отговор № 1

Променете кода си на:

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

че не е нужно да се обаждате на super.method (), стига методът да е защитен (публичен дори по-добре), може просто да го опростите:

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

Обаждате се само супер. ако въведете отново метода в класа на детето си и искате да се обадите специално на класа родител, който обикновено може да се види в конструктор, който се обажда на родител конструктор.

Още нещо: Вашият аксесоар трябва да бъде променен малко, само за случая с предупреждението. вижте кода по-долу. Обикновено IDE трябва да поддържа автоматично генериране на аксесоар.

    public int getHeight() {
return height;
}

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

}

1 за отговор № 2

Този код:

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

няма да промени нищо, защото увеличението на height ще се случи след обаждането до super.setHeight(), Така че просто настройвате височината на текущата си стойност.