2013-08-27 1 views
0

Скажет, у меня следующая структура наследования класса:GetFields базового класса вместо инстанциировано один

public class Animal 
{ 
    public Animal() 
    { 
     setDefault(); 
    } 

    public void setDefault() 
    { 
     Field[] Fields = this.getClass().getFields(); 
     for (Field F : Fields) 
     { 
     // perform some initialization per field class 
     if (MyObject.class.isAssignableFrom(F.getType())) 
     { 
      ((MyObject) f.get(this)).setValue(0); 
     } 
     // ... 
     } 
    } 
} 

public class Cat extends Animal 
{ 
    public Cat() 
    { 
     super(); 
     setDefault(); 
    }  
} 

public class Kitten extends Cat 
{ 
    public MyObject myobject1 = new MyObject(); 

    public Kitten() 
    { 
    super(); 
    setDefault(); 
    } 
} 

Как я создание экземпляра Kitten объекта, я бег в setDefault() методе родительского класса Animal wihtout, имеющее создание экземпляра в myobject1 член. Затем я запускаю команду NullPointerException, пытаясь ее инициализировать.

Будет ли способ получить тип базового класса в каждом вызове setDefault()? То есть, когда, находясь в Animal классе this.getClass() (или так уступит Animal, в Cat классе даст Cat. Это делается для того, чтобы установить значения по умолчанию только из родительского класса для дочерних классов, шаг за шагом.

Do у вас есть какая-либо другая настройка, которую я могу подать?

Конечно, я могу добавить тест, чтобы проверить, не поле не пустое, но это не так. Я хотел бы установить значения по умолчанию только для полей каждого класса setDefault.

Я не могу изменить иерархию классов и объявления участников.

ответ

0

, если я понял, что вы просите это сделать setDefault метод, который будет принимать getClass и получит класс он находится, это означает, что setDefault в Animal класс установит только поля Animal.

Если это то, что вы просите, тогда вам не нужно делать getClass, вы можете просто установить значения по умолчанию для членов класса. у вас есть разрешения на их изменение, потому что они находятся в вашем классе.

также, вы можете переопределить метод setDefault, изменять значения в каждом классе в иерархии и вызовите функцию родительского поэтому каждый элемент установлен

+0

Вы действительно правы. Но в моем случае 'setDefault' класса' Animal' является общим методом для установки значения по умолчанию для экземпляров 'MyObject'. Я просто хочу установить значения для полей, которые ** объявлены ** на уровне класса, но в методе родительского класса 'setDefault'. – microcosme

0

Вы можете переопределить метод SetDefault() в каждом классе.

public class Animal 
{ 
    public Animal() 
    { 
     setDefault(); 
    } 

    public void setDefault() 
    { 
     Field[] Fields = this.getClass().getFields(); 
     for (Field F : Fields) 
     { 
     // perform some initialization per field class 
     if (MyObject.class.isAssignableFrom(F.getType())) 
     { 
      ((MyObject) f.get(this)).setValue(0); 
     } 
     // ... 
     } 
    } 
} 

public class Cat extends Animal 
{ 
    public Cat() 
    { 
     setDefault(); 
    } 

    @Override 
    public void setDefault() { 
     // do some special things 
    } 
} 

public class Kitten extends Cat 
{ 
    public MyObject myobject1 = new MyObject(); 

    public Kitten() 
    { 
     setDefault(); 
    } 

    @Override 
    public void setDefault() { 
     // do some special things 
    } 
} 
+0

Это актуально, что сделано ;-) Но тогда базовый 'setDefault' все равно попытается инициализировать элемент' MyObject', который еще не создан ...: - $ – microcosme

+0

ok, тогда вам нужно удалить строку с помощью супер() - вызов. – JavaDM

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