从父类类型方法返回子对象

时间:2014-05-08 21:44:01

标签: java class oop methods

我正在尝试编写一个创建随机植物的方法,并将创建的植物的对象作为Plant返回。在下面的示例中,方法createPlant()的类型为Plant,并返回子类Tree的对象。事实证明我的思维方式是错误的。 Eclipse提供的错误是:“此方法必须返回Plant类型的结果”。那么我应该如何创建这样的方法呢?

public abstract class Plant {
    ...
}

public class Tree extends Plant {
    ...
}

public class Bush extends Plant {
    ...
}

public class Map {
    private Plant plant;
    ...
    public static Plant createPlant(float x, float y) { // This method must return a result of type Plant
        Random generator = new Random();            
        switch (generator.nextInt(2)) {
            case 0:
                return new Tree(x, y);
            case 1:
                return new Bush(x, y);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

不,从面向对象的角度来看,这绝对没问题。植物是一般的实体,而树在某种程度上是专门的。

重点是树也是一种植物(is-a-relation),所以返回植物的方法可以返回任何至少与植物一般的东西,但也可能更专业。

答案 1 :(得分:0)

添加null的默认案例。

    switch (generator.nextInt(2)) {
        case 0:
            return new Tree(x, y);
        case 1:
            return new Bush(x, y);
        default:                         // Requires default case
            return null;
    }

或创建一个虚拟NoPlant

  public class NoPlant extends Plant {
     ...
  }

现在以这种方式使用

    switch (generator.nextInt(2)) {
        case 0:
            return new Tree(x, y);
        case 1:
            return new Bush(x, y);
        default:                         // Requires default case
            return new NoPlant();
    }

- 编辑 -

也可以这样尝试

    int random=generator.nextInt(2); // return either 0 or 1

    if(random==0){
        return new Tree(x,y);
    }else{
        return new Bush(x, y);
    }