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

或者,您可以完全避免使用抽象类(或者至少不强制它看到例如这个问题这个问题)。广受好评的《Effective Java 》一书建议“优先使用接口而不是抽象类”。

为此,改为

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 回答