gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:53:33 27 4
gpt4 key购买 nike

有这样的东西:

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
{

}

我想要扩展 act,如果 super 不处理它,然后尝试在 Major 中处理它。例如。添加 PRINT_STAT("print-statistics", "ps") - 但同时让 Base 类处理默认值,如 QUIT

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

到目前为止我所做的是添加一个接口(interface) 通常:

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

在类Base中实现BaseFace:

      case UNKNOWN:
OK = act_other(inp);

Major类中:

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

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

还有一个主要问题:

有没有什么好方法可以扩展 Token 类,以便我可以在 Major 中使用与 Base 中相同的切换方法?我想知道是否有一个更好的设计,第二个是我是否必须为 Major 创建一个新的 Token 类,或者我是否可以扩展或以其他方式重用现有的。


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

最佳答案

所有枚举都隐含地扩展枚举。在 Java 中,一个类最多可以扩展一个其他类。

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

来自 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 开始,接口(interface)可以包含 default methods .这允许您在接口(interface)中包含方法实现(但不包括状态)。尽管此功能的主要目的是允许公共(public)接口(interface)的演变,但您可以使用它来继承自定义方法,定义多个枚举类之间的公共(public)行为。

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

例如:

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

关于java - 如何从抽象类扩展枚举类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15450897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com