我正在尝试建立一个抽象类。我想确保任何子类都有一个列出其潜在操作的枚举。
例如,Foo
是一个抽象类。
Fee extends Foo and can...
TALK
WALK
SLEEP
Bar extends Foo and can...
SIT
STARE
我想给父类提供字段,并让子类使用它能够执行的操作填充枚举。我该如何处理?
例如,如果我在类中定义枚举,给它一些通用动作,它是否会传递给子类并且子类可以扩展枚举吗?这可能是另一种选择。
答案 0 :(得分:4)
我不知道我同意这种方法,但你可以做到
enum CanDos {
TALK,
WALK,
SLEEP,
SIT,
STARE
}
然后课程可以
abstract class Foo {
abstract Set<CanDos> getCanDos();
//or
abstract boolean can(CanDos item);
}
您可以使用EnumSet
来有效存储功能。
如果您正在寻找的是提供一组枚举的正确的东西(比如您提到的父抽象类中的字段),那么我认为EnumSet<CanDos>
是您的家伙。在那种情况下
abstract class Foo {
private final Set<CanDos> candos;
protected Foo(Set<CanDos> candos)
{
this.candos = new EnumSet<CanDos>(candos);
}
public boolean can(CanDos item) {
return candos.contains(item);
}
}
或者你可以完全避免抽象类(或者至少不要求它看到例如this question或this one)。备受好评的书 Effective Java 建议使用“Prefer interfaces to abstract classes”。
要做到这一点,而不是
enum CanDos {
TALK,
WALK,
SLEEP,
SIT,
STARE
}
public interface FooThatCanDo {
boolean can(CanDos item);
}
如果你真的认为公共继承根(你应该认真考虑)有价值,那么你可以提供一个如上所示的抽象基础实现,并声明它implements FooThatCanDo
。
答案 1 :(得分:0)
我认为枚举不是你想要的,至少不是直接的。也许你可以使用BitSet。
class Base {
private static EnumSet actions;
public EnumSet getActions() { return actions; }
}
class Derived extends Base {
private static EnumSet actions;
@Override
public EnumSet getActions() {
return new EnumSet(actions).addAll(super.getActions());
}
}