2013-11-27 4 views
0

, пытаясь получить представление о полиморфизме и наследовании, я сделал небольшую программу, чтобы продемонстрировать эти темы. Программа состоит из суперкласса «Дерево» и трех подклассов «Береза», «Клен» и «Дуб». Конструктор дерева делает это так, чтобы все деревья начинались с высоты 20 и 200 листьев. В Tree у меня есть абстрактный метод, называемый grow().Доступ и изменение свойств суперкласса из подкласса?

Вот код для дерева:

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

Очевидно, что значения в суперкласса не изменяются. Любая помощь будет оценена! Благодаря!

+2

Можете ли вы разместить код для 'Tree'? –

+0

хотя все еще зависит от того, как написано древовидный класс, попробуйте super.setHeight (++ height); – Rudy

+0

okay @ElliottFrisch, я отправил код для дерева –

ответ

1

Изменить код:

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

отметить, что вам не нужно звонить super.method(). до тех пор, пока метод защищен (общественность еще лучше), вы можете просто упростить его до:

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

Вы называете только супер. если вы снова реализуете метод в своем дочернем классе и хотите специально вызвать родительский класс, который обычно можно увидеть в конструкторе, вызывающем родительский конструктор.

Еще одна вещь: ваш аксессор должен немного измениться только для случая предосторожности. см. код ниже. Обычно ваша среда разработки должна поддерживать автоматическую генерацию доступа.

public int getHeight() { 
    return height; 
    } 

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

    } 
+0

Даже после изменения оператора по высоте до предварительного приращения он все равно не меняет значение; основная функция по-прежнему оставляет высоту на 20 –

+0

показать нам класс дерева и класс дуба – Rudy

+0

Я просто поместил код для дерева. Дуб написан почти точно как береза ​​и клен, за исключением имени конструктора и количества листьев, которые он увеличивает в вырасте(). –

1

Этот код:

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

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

+1

+1 post postment, good point –

Смежные вопросы