2017-04-10 73 views
-1

我正在创建一个程序,其中有一个动物类,并扩展了“羊”和“牛”类。 在我的程序中,我还有一个'Farm'类,它将在调用'generate()'时创建一个新的动物。当我初始化该程序时,每个农场都有一个特定的动物来生成。从更普通的类生成对象

我可以想出几种方法来做到这一点,但没有一个看起来特别好。我想出了一个办法是有我的课列明这样的:

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 
    } 
} 

这似乎疯狂复杂难懂的东西,我只能假设有一个简单而优雅的解决方案。在这种情况下,我实际上使用羊作为类型(对于农场)和对象(对于创建时)。最重要的是,它让我误以为新的Sheep()实际上并没有创建一只绵羊,并且只有在调用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 
    } 
} 

这是漂亮和整洁的表面上,但需要额外的,完全无用类为每一个新动物加入到节目。不完全理想。

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

所以,我的问题是,处理这种情况的最佳方式是什么,并且比上述解决方案有更简单的方法吗?

我完全自学成功,所以我不知道做事情的正确方法,不得不用Google为自己解决问题,但在这里我完全失败了;我不知道在哪里甚至可以开始寻找关于常见编程范例的信息,当然,除了维基百科,它并不完全符合“学会编写整洁的代码”教程。

如果我的问题脱落模糊甚至降权荒谬的,请你只问我澄清。

+2

我甚至无法在这里找到问题。 –

+0

完全是我的错。忘了问什么。我的问题是:什么是接近的情况下最好的办法,例如这个,有没有做的事情比我已经张贴上述方案中的一个更简单的方法? – Oberdiah

+0

我不是对问题的陈述清楚这里,你为什么不能简单地做同样的事情在'Sheep'类的内部选项1激起你正在做的选项2? – developer

回答

0

,我会去了解它的方法是使用泛型类型Farm(但是,你必须消除对Animal类抽象标识符):

public class Farm<E extends Animal> { 

    private E e; 

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

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

} 

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

+0

这真的很棒!泛型类型正是我正在寻找的!尽管如此,我仍然感到困惑,因为在农场实际生成一只绵羊之前,这仍然需要使用'new Sheep()',迫使绵羊的构造函数代码移至spawnMe(); – Oberdiah

+0

@Oberdiah是的,不幸的是我不认为有可能使用抽象工厂模式来创建不同类型的子对象,但泛型类型将是一种可行的方式! –

+0

因此,通常的做法是,推荐将大部分初始化代码移动,比如添加到实体列表并将渲染设置为单独的方法,如createMe()? 下面有人发布了一些关于'新T()',这将是很好,但不可能的原因很明显。 – Oberdiah

0

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