【问题标题】:Accessing methods in another class访问另一个类中的方法
【发布时间】:2013-12-27 08:12:46
【问题描述】:

我有一个 Worker 类,我想从蜂巢、花园和超类花的所有子类中访问方法。一个工人在一个花园里的蜂巢中的一个数组列表中,花园里也有一个花的数组列表。我已经使用构造函数从 hive 访问了方法:

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

我想从花园中访问方法 findFlower() 来获取一朵花,然后从我得到的花中提取花粉(每种类型的花都继承自超类花)来获取花粉。我是否需要为花园和每种类型的花制作更多的构造函数,还是需要 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;
    }
}

【问题讨论】:

    标签: java class methods arraylist superclass


    【解决方案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 实例并允许您使用 findFlower 访问

    Garden.getInstance().findFlower();
    

    当你第一次调用 getInstance() 时,它会创建一个新的 Garden

    【讨论】:

    • 我想你忘记了“私人花园实例”中的“静态”; :)
    【解决方案2】:

    我可以建议这个...

    如果没有蜂巢或花园,工人就无法“工作”。两者都供应。此外,花不需要是成员变量。它对 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 设计时所做的权衡:)

    【讨论】:

    • 我应该提出我的问题,即省略了一些代码。 another day 方法需要返回一只蜜蜂,因为经过一定天数,工人将变成另一种类型的蜜蜂。构造函数也必须是public Worker(Hive hive),因为超类具有该构造函数,并且所述超类中的大多数其他子类都需要 Hive 配置单元构造函数,并且根本不需要花园。 anotherDay 方法也被继承了,其他子类以花园为参数是没有意义的!感谢您到目前为止的帮助
    • hmm.. 关于 anotherDay() 返回 Bee。如果方法在 Bee 的实例上,则返回值只能是“this”或另一个 Bee 实例。我了解您已获得此代码可以使用,但它不是一个很好的设计。调用者应该知道可能会返回一个新的 Bee,并停止调用它已经拥有的 Bee 引用。
    • 请注意:对象继承已被证明被高估,导致的问题多于它解决的问题。这方面的文章和观点很多。使用组合和接口可以实现相同的“结果”。无论如何,我并不是要在这里对此展开大讨论。只是要指出,如果您获得了某个类层次结构并且它不适合您的需要,那不是您的错。 :)
    • 非常感谢您的帮助-一切都可以编译,但不幸的是,现在当我运行我的代码时,我得到了一个空指针异常。你知道这是为什么吗?
    • 堆栈跟踪应该让您知道发生的位置。在您上面的代码中,您有一个私人花园;但没有任何东西是。
    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2018-11-13
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多