我不知道我同意这种方法,但你可以这样做
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);
}
}
或者,您可以完全避免使用抽象类(或者至少不强制它看到例如这个问题或这个问题)。广受好评的《Effective Java 》一书建议“优先使用接口而不是抽象类”。
为此,改为
enum CanDos {
TALK,
WALK,
SLEEP,
SIT,
STARE
}
public interface FooThatCanDo {
boolean can(CanDos item);
}
如果您真的认为公共继承根中存在价值(您应该认真考虑),那么您可以提供如上所示的抽象基础实现,并声明它implements FooThatCanDo
.