0

假设我有以下类继承结构:

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没有实例化该myobject1成员。然后我在 a 中运行,NullPointerException因为它尝试初始化它。

有没有办法在每次setDefault()调用中获取基类类型?那是当在Animal类中时this.getClass()(或者会 yield Animal,在Cat类中会 yield Cat。这是为了逐步设置仅从父类到子类的默认值。

您还有其他我可以申请的设置吗?

当然,我可以添加一个测试来检查该字段是否不为空,但这不是重点。我想将默认值设置为每个类setDefault调用的字段。

我无法更改类层次结构或成员的声明位置。

4

2 回答 2

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
   }
}
于 2013-08-27T12:26:37.090 回答
0

如果我理解你的要求是做setDefault将采取getClass并获得它所在的类的方法,这意味着setDefaultinAnimal类将只设置Animal.

如果这是您要问的,那么答案是您不需要这样做getClass,您只需设置班级成员的默认值即可。您有权更改它们,因为它们在您的班级中。

此外,您可以覆盖该setDefault方法,更改层次结构中每个类的值并调用父函数,以便设置每个成员

于 2013-08-27T12:24:43.293 回答