3

抽象クラスを確立しようとしています。すべてのサブクラスに、その潜在的なアクションをリストする列挙型があることを確認したいと思います。

たとえば、Fooは抽象クラスです。

Fee extends Foo and can...
    TALK
    WALK
    SLEEP

Bar extends Foo and can...
    SIT
    STARE

親クラスにフィールドを指定し、子クラスに可能なアクションを列挙型に入力させたいと思います。これにどのようにアプローチしますか?

たとえば、クラスで列挙型を定義した場合、それにいくつかの一般的なアクションを与えますが、それはサブクラスに渡され、サブクラスは列挙型を拡張できますか?それは別のオプションかもしれません。

4

2 に答える 2

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

あるいは、抽象クラスを完全に回避することもできます(または、少なくともこの質問またはこの質問を参照することを義務付けないでください)。評判の高い本EffectiveJavaは、「抽象クラスよりもインターフェースを優先する」ことを提案しています。

これを行うには、代わりに

enum CanDos {
  TALK,
  WALK,
  SLEEP,
  SIT,
  STARE
}

public interface FooThatCanDo {
  boolean can(CanDos item);
}

共通の継承ルートに価値があると本当に思う場合(これについてはよく考える必要があります)、上記のように抽象ベースの実装を提供し、それを宣言することができますimplements FooThatCanDo

于 2012-05-09T23:24:46.443 に答える
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()); 
    }
}
于 2012-05-09T23:25:11.570 に答える