2013-12-10 195 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

相關問題