私がアプローチに同意するかどうかはわかりませんが、あなたはできます
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);
}
}
あるいは、抽象クラスを完全に回避することもできます(または、少なくともこの質問またはこの質問を参照することを義務付けないでください)。評判の高い本EffectiveJavaは、「抽象クラスよりもインターフェースを優先する」ことを提案しています。
これを行うには、代わりに
enum CanDos {
TALK,
WALK,
SLEEP,
SIT,
STARE
}
public interface FooThatCanDo {
boolean can(CanDos item);
}
共通の継承ルートに価値があると本当に思う場合(これについてはよく考える必要があります)、上記のように抽象ベースの実装を提供し、それを宣言することができますimplements FooThatCanDo
。