【发布时间】:2014-11-17 15:10:13
【问题描述】:
我正在做一个非常愚蠢的 ALife-esque 应用程序,并且我拥有以下具有以下继承关系的类:
(抽象)生命体
(抽象)生命体
植物和动物有一些共同的状态,理想情况下,我希望这种行为在 Lifeform 中以初级形式存在。
abstract class Lifeform
{
public static enum State
{
IDLE,
DEAD
}
protected void someMethodSomewhere()
{
....
state = State.IDLE; // this to be recognized by inherited creatures
....
}
protected State state;
}
class Plant extends Lifeform
{
public Plant() { state=new Plant.State(); }
public static enum State extends Lifeform.State // (can't)
{
FEEDING,
REPRODUCING,
}
}
class Animal extends Lifeform
{
public Animal() { state=new Animal.State(); }
public static enum State extends Lifeform.State // (can't)
{
FEEDING,
FORAGING,
FLEEING,
GROUPING,
REPRODUCING
}
// elsewhere in some method
public void someMethod()
{
switch(state)
{
case IDLE: (...) // from Lifeform.State
case FEEDING: (...) // from Animal.State
case DEAD: (...)
....
}
}
}
在后来的(1.5+)java 中是否有允许类似的功能,或者我最好将这个状态层次嵌入到它自己的传统类中?
【问题讨论】:
-
您可以将所有状态放在一个
enum中,并验证该类的确切状态。或者您可以单独使用enums。 -
@Luiggi,我早期拒绝的第一个解决方案,因为它涉及让基类维护有关所有潜在子类的信息。初级生命体不应该这样做。第二个使 Lifeform 类不会根据需要更改状态。
-
嗯,在 Java 中你不能从
enum扩展,所以你的用例是不可能的。有两种选择,可能你不应该使用enum来解决这个问题。 -
如果你愿意,你可以让枚举实现接口,假设枚举需要有特定的方法。但是你正在做的不是一个选择。
-
@Luiggi,是的,这是我开始的最初前提——枚举本身无法解决这个问题。我不清楚在这里采取的最干净的路线。国家需要生活在各个层面。我希望保持生物的等级(而不是一种可以简单地自行进化成任何东西并仍然保持自己的等级的生命形式),并且我不希望任何特定的级别能够深入了解子级别,坦率地说,这将是粗俗的。
标签: java inheritance enums