2013-12-10 156 views
0

我有一个类工作人员,我想访问方法从蜂巢,花园和超类花的所有子类。一名工作人员正在花园里的蜂房里进行阵列表演,花园里还有一个阵列式的鲜花。我曾访问过使用构造从蜂巢方法:访问另一个类的方法

public worker(Hive hive){ 
    this.hive= hive 
} 

我想从花园访问方法findFlower()来得到一个花和extractPollen()(其中每种类型的花从超类继承花)从我得到的花朵从他们花粉。我是否需要为花园和每种花卉制造更多的施工人员,还是需要2名施工人员,1名花园工作人员和1名超级施工人员花卉工作人员?

我迄今为止代码:

public class Worker extends Bee { 

    Hive hive = null; 
    public Garden garden; 
    public Flower flower; 

    public Worker(Hive hive){ 
     this.hive=hive; 
     this.type = 2; 
     this.age=11; 
     this.health=3; 
    } 

    public Bee anotherDay(){ 
     flower= garden.findFlower(); 
     flower.extractPollen(int); 
     eat(); 
     age++; 
    } 
} 

public class Garden{ 

    ArrayList<Flower> flowerbed = new ArrayList<Flower>(); 

    public Flower findFlower(){ 
     //code which returns a random flower from my arraylist 
    } 
} 

public class Flower{ 

    public boolean extractPollen(int po){ 
     if(po <= pollen){ 
      pollen= pollen - po; 
      return true; 
     }return false; 
    } 
} 

回答

1

五月我建议这...

工人不能“工作”没有蜂巢或花园。供应两种。此外,花不需要是一个成员变量。它的本地到anotherDay()。另外,anotherDay()不需要返回Bee。无论如何,调用者都会引用您的对象。

public class Worker extends Bee { 
    private Hive hive; 
    private Garden garden; 

    public Worker(Hive hive, Garden garden){ 
     super(hive); 
     this.hive=hive; 
     this.garden = garden; 
     this.type = 2; 
     this.age=11; 
     this.health=3; 
    } 

    public void anotherDay(){ 
     Flower flower = garden.findFlower(); 
     flower.extractPollen(/* some value */); 
     eat(); 
     age++; 
    } 
} 

另一种方法是Hive和Garden根本不是成员,但是被传递给每个方法调用。例如anotherDay(Garden garden);这样做的好处是你的工作人员可以漫游花园。缺点是调用代码必须管理Garden对象。这些都是你做OO设计时的折衷:)

+0

我应该把我的问题放在一些代码省略。另一天的方法需要返回一只蜜蜂,因为在一段时间之后,工人会变成另一种蜜蜂。构造函数也必须是“public Worker(Hive hive)”,因为超类具有该构造函数,并且所述超类中的大多数其他子类都需要Hive配置单元构造函数,并且根本不需要该花园。 anotherDay方法也是继承的,其他具有它的子类将花园作为参数是没有意义的!感谢迄今为止的帮助 – user2973447

+0

hmm ..关于anotherDay()返回蜜蜂。如果该方法位于Bee的一个实例上,则返回值只能是“this”或另一个Bee实例。我知道你已经得到了这个代码,但它不是一个很好的设计。呼叫者应该知道一个新的蜜蜂可能会被退回,并停止呼叫已经拥有的蜜蜂参考。 – slipperyseal

+0

你可以用Hive调用super构造函数。我将编辑我的代码.... – slipperyseal

1

你可以试试;

public class Garden { 

    ArrayList<Flower> flowerbed = new ArrayList<Flower>(); 
    private static Garden instance; 

    public Flower findFlower(){ 
     //code which returns a random flower from my arraylist 
    } 

    public static Garden getInstance() { 
     if (instance == null) { 
       instance = new Garden(); 
     } 
     return instance; 
    } 
} 

这将返回花园的实例,并允许您与

Garden.getInstance().findFlower(); 

访问findFlower当你调用某个getInstance()首次将创建一个新的花园

+0

我想你忘记了“私人花园实例”中的“静态” :) – slipperyseal

+0

谢谢,没有看到。 – JustBrenkman

相关问题