java – 如何从抽象类扩展枚举类?

有这样的事情

public enum Token
{
     FOO("foo", "f"),
     QUIT("quit", "q"),
     UNKNOWN("", "");
     ...

     public parse(String s) {
         for (Token token : values()) {
              ...
              return token;
         }
         return UNKNOWN;
     }
}

抽象类:

abstract class Base 
{
    private boolean run;

    Base() {
        run = true;

        while (run) {
             inp = getInput();
             act(inp);
        }
    }

    public boolean act(String s) {
        boolean OK = true;
        switch (Token.parse(inp)) { /* Enum */
             case FOO:
                    do_foo();
                    break;
             case QUIT:
                    run = false;
                    break;
             case UNKNOWN:
                    print "Unknown" + inp;
                    OK = false;
                    break;
             }
         }
         return OK;
    }
}

和扩展器:

class Major extends Base
{

}

我想要的是扩展行为,如果超级不处理它,然后尝试在Major中处理它。例如。添加PRINT_STAT(“print-statistics”,“ps”) – 但同时让Base类的句柄默认为QUIT。

这是一个完全错误的做法吗?

到目前为止,我已经做了这样一个接口:

public interface BaseFace
{
      public boolean act_other(String inp);
}

并且在类Base Base BaseFace中:

      case UNKNOWN:
          OK = act_other(inp);

并在班上专业:

  public boolean act_other(String inp) { 
       if (inp.equals("blah")) {
            do_blah();
            return true; 
       }
       return false;
  }

这看起来像一个可用的设计吗?

而且,主要问题:

有没有一些很好的方式来扩展令牌类,以便我可以使用与Base相同的开关方法?我想知道的是,如果一个是更好的设计,第二个如果我必须为Major授予新的令牌类,或者我以某种方式扩展或以其他方式重新使用现有的。

编辑点:概念是让Base类可以轻松地在不同的项目中重用处理各种类型的输入。

所有枚举都暗示扩展枚举。在Java中,一个类最多可以扩展一个类。

但是,您可以让您的枚举类实现一个接口。

this Java tutorial on Enum Types

Note: All enums implicitly extend java.lang.Enum. Because a class can only extend one parent (see Declaring Classes), the Java language does not support multiple inheritance of state (see Multiple Inheritance of State, Implementation, and Type), and therefore an enum cannot extend anything else.

为Java编辑8:

从Java 8开始,接口可以包括default methods.这允许您在接口中包含方法实现(而不是状态)。尽管此功能的主要目的是允许公共接口的演进,但您可以使用它来继承定义多个枚举类之间常见行为的自定义方法。

但是,这可能是脆弱的。如果具有相同签名的方法稍后添加到java.lang.Enum类中,它将覆盖您的默认方法。 (当一个方法在类的超类和接口中定义时,类实现总是胜利。)

例如:

interface IFoo {
    public default String name() {
        return "foo";
    }
}

enum MyEnum implements IFoo {
    A, B, C
}

System.out.println( MyEnum.A.name() );  // Prints "A", not "foo" - superclass Enum wins
http://stackoverflow.com/questions/15450897/how-to-extend-enum-class-from-abstract-class

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 如何从抽象类扩展枚举类?