从更通用的类

时间:2017-04-10 21:27:51

标签: java

我创建了一个程序,我有一个Animal类,并扩展它,一个'绵羊'和'牛'类。 在我的计划中,我还有一个农场'当生成()'生成新动物的类叫做。当我初始化程序时,每个农场都会获得一个特定的动物来生成。

我可以想到几种方法,但没有一种方法看起来特别好。我提出的一种方法是让我的课程如下:

public class Farm {
    public Animal typeOfAnimalToSpawn;

    public Farm(Animal a) {
        typeOfAnimalToSpawn = a;
    }

    public void generate() {
        typeOfAnimalToSpawn.spawnMe();
    }
}

public abstract class Animal {
    public abstract void spawnMe();
}

public class Sheep {
    public void spawnMe() {
        new Sheep().create();
    }

    public void create() {
        // Spawn this sheep onto the field (By making it visible or something)
        // Do whatever needs done when a sheep arrives
    }
}

对于我只能假设有一个简单而优雅的解决方案的东西来说,这看起来非常复杂和令人费解。在这种情况下,我实际上使用绵羊作为一种类型(对于农场)和一个对象(对于它创建时)。除此之外,它让我感到困扰的是打电话给新的羊()'实际上并没有创建一只绵羊,只有在调用create()之后才会发生任何事情。将动物的整个实例存储起来仅仅作为农场生产未来动物的类型也是不合适的。

简单地为每种类型的动物建立一个农场是很容易的:

public abstract class Farm {
    public abstract generate();
}

public class SheepFarm extends Farm {
    public void generate() {
        new Sheep();
    }
}

public class Sheep {
    public Sheep() {
        // Do whatever needs done when a sheep arrives
    }
}

表面上的表现很好,但是对于添加到程序中的每一种新动物来说都需要一个额外的,完全无用的课程。也不完全理想。

还有另一种方式,有反思,但我不愿意使用它,因为我确信有一些更明智的做事方式。

所以,我的问题是,处理这种情况的最佳方法是什么,是否有比我上面发布的解决方案更简单的做事方式?< / em>的

我完全是自学成才,因此我不知道正确的做事方式,并且不得不为谷歌自己解决问题,但我在这里完全失败了。我甚至不知道从哪里开始查找有关常见编程范例的信息,当然,除了维基百科之外,它并没有完全带来“学会编写简洁的代码”。教程。

如果我的问题出现模糊甚至是右下角的荒谬,请让我澄清一下。

2 个答案:

答案 0 :(得分:0)

我要考虑的方法是使用Farm的泛型类型(但是,您必须删除Animal类上的抽象标识符):

public class Farm<E extends Animal> {

    private E e;

    public Farm() {
        this.e = (E) new Animal();
    }

    public void generate() {
        e.spawnMe();
    }

}

如果你不熟悉泛型类型,我肯定会研究它们!

答案 1 :(得分:0)

您的第一个解决方案似乎非常有效。我认为这是最好的方法,因为你可以输入Farm sheepfarm = new Farm(new Animal...)。祝你好运:)