докато се опитват да разберат полиморфизма иНаследството направих малка програма, която да демонстрира тези теми. Програмата се състои от класа "Дърво" и три подкласа "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()
, Така че просто настройвате височината на текущата си стойност.